home *** CD-ROM | disk | FTP | other *** search
/ The Utilities Experience / The Utilities Experience - Volume 1.iso / software / emulation / frodo / src / 6510sc.asm < prev    next >
Assembly Source File  |  1996-01-29  |  58KB  |  3,427 lines

  1. *
  2. * 6510SC.asm - Einzelzyklus-6510-Emulation
  3. *
  4. * Copyright (C) 1995-1996 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Registerbelegung:
  12. * d5: Von VIC-Emulation benutzt
  13. * d6: Von VIC-Emulation benutzt
  14. * d7: 6510-Programmzähler
  15. * a3: Von VIC-Emulation benutzt
  16. * a4: Zeiger für Near-Adressierung
  17. * a5: Zeiger in C64-RAM, Offset 32K (für Adressierung mit Vorzeichen)
  18. * a6: Zeiger auf die Routine für den nächsten Taktzyklus. Er wird immer
  19. *     am Ende einer Zyklusroutine gesetzt.
  20. *
  21. * Opcode-Ausführung:
  22. *  - Alle Opcodes sind in einzelne Taktzyklen aufgelöst, für jeden
  23. *    Taktzyklus eines Opcodes existiert eine Routine
  24. *  - Die Zyklusroutinen werden vom VIC-Emulator über jsr (CONT)
  25. *    angesprungen, jede Routine setzt diesen Zeiger am Ende auf die
  26. *    nächste Routine
  27. *  - Die Taktzyklen werden von 1 bis 8 gezählt, jede Zyklusroutine
  28. *    enthält die Nummer der Zyklus im Namen getrennt durch einen Punkt
  29. *  - Im ersten Taktzyklus wird immer der Opcode gelesen
  30. *  - In jedem Taktzyklus findet genau ein Speicherzugriff statt
  31. *
  32. * Speicherkonfigurationen:
  33. *
  34. * $01  $a000-$bfff  $d000-$dfff  $e000-$ffff
  35. * -----------------------------------------------
  36. *  0       RAM          RAM          RAM
  37. *  1       RAM       Char-ROM        RAM
  38. *  2       RAM       Char-ROM    Kernal-ROM
  39. *  3    Basic-ROM    Char-ROM    Kernal-ROM
  40. *  4       RAM          RAM          RAM
  41. *  5       RAM          I/O          RAM
  42. *  6       RAM          I/O      Kernal-ROM
  43. *  7    Basic-ROM       I/O      Kernal-ROM
  44. *
  45. * Zugriff auf den C64-Speicher:
  46. *  - Alle Speicherzugriffe laufen über die Read/Write-Makros,
  47. *    es sind keine Abkürzungen erlaubt
  48. *  - Das RAM wird immer über ein 16-Bit-Offset angesprochen (also mit
  49. *    Vorzeichen)
  50. *
  51. * Inkompatibilitäten:
  52. *  - RRA und ISB kennen keinen Dezimalmodus
  53. *  - BRK kann nicht von IRQ/NMI unterbrochen werden
  54. *  - Wenn BA low und AEC high ist, sollte ein Lesezugriff stattfinden
  55. *
  56.  
  57. DEBUG_DETAIL    SET 0
  58. DEBUG_PC    = $0942
  59.  
  60. DE00_COMPATIBLE    SET 1
  61.  
  62.         MACHINE 68020
  63.  
  64.         INCLUDE    "exec/types.i"
  65.         INCLUDE    "exec/macros.i"
  66.         INCLUDE    "dos/dostags.i"
  67.         INCLUDE    "Frodo_rev.i"
  68. CATCOMP_NUMBERS    = 1
  69.         INCLUDE    "LocStrings.i"
  70.         INCLUDE    "debug.i"
  71.  
  72.         XREF    _SysBase
  73.         XREF    _DOSBase
  74.         XREF    _IntuitionBase
  75.  
  76.         XREF    GetString    ;Strings.o
  77.         XREF    TheLocale
  78.  
  79.         XDEF    TheRAM        ;Main.asm
  80.         XDEF    TheBasic
  81.         XDEF    TheKernal
  82.         XDEF    TheChar
  83.         XDEF    TheColor
  84.         XREF    MainTask
  85.         XREF    Random
  86.         XREF    ResetC64
  87.  
  88.         XREF    _InitDisplayFrom6510    ;Display.c
  89.         XREF    _ExitDisplayFrom6510
  90.         XREF    _EmulToBack
  91.         XREF    _EmulToFront
  92.  
  93.         XREF    ReadFrom6526A    ;6526SC.asm
  94.         XREF    ReadFrom6526B
  95.         XREF    WriteTo6526A
  96.         XREF    WriteTo6526B
  97.  
  98.         XREF    Main6569    ;6569SC.asm
  99.         XREF    ReadFrom6569
  100.         XREF    WriteTo6569
  101.     IFNE    DE00_COMPATIBLE
  102.         NREF    LastVICByte
  103.     ENDC
  104.         NREF    CycleCounter
  105.  
  106.         XREF    ReadFrom6581    ;6581.asm
  107.         XREF    WriteTo6581
  108.  
  109.         XREF    IECOut        ;IEC.asm
  110.         XREF    IECOutATN
  111.         XREF    IECOutSec
  112.         XREF    IECIn
  113.         XREF    IECSetATN
  114.         XREF    IECRelATN
  115.         XREF    IECTurnaround
  116.         XREF    IECRelease
  117.  
  118.         XDEF    Init6510
  119.         XDEF    Reset6510
  120.         XDEF    Start6510
  121.         XDEF    Stop6510
  122.         XDEF    _Pause6510
  123.         XDEF    _Resume6510
  124.         XDEF    _SAMReadByte
  125.         XDEF    _SAMWriteByte
  126.         XDEF    Localize6510
  127.         XDEF    IntIsRESET
  128.         XDEF    IntIsNMI
  129.         XDEF    IntIsIRQ
  130.         XDEF    IntIsVICIRQ
  131.         XDEF    IntIsCIAIRQ
  132.         XDEF    FirstIRQCycle
  133.         XDEF    FirstNMICycle
  134.         XDEF    NMIState
  135.         XDEF    BALow
  136.         XDEF    CPUTask
  137.         XDEF    IsFrodoSC
  138.         XDEF    _IsFrodoSC
  139.         XDEF    _InvokeSAMSet
  140.     IFNE    DEBUG_DETAIL
  141.         XDEF    DEBUGON
  142.     ENDC
  143.  
  144.         NEAR    a4,-2
  145.         XREF    _DATA_BAS_
  146.  
  147.         SECTION    "text",CODE
  148.  
  149.         FAR
  150.  
  151.  
  152. **
  153. ** Definitionen
  154. **
  155.  
  156. ; Registerbelegung
  157. RPC        EQUR    d7    ;PC
  158. RAMPTR        EQUR    a5    ;Zeiger in C64-RAM, Offset 32K (für Adressierung mit Vorzeichen)
  159. CONT        EQUR    a6    ;Zyklusfortsetzungszeiger
  160.  
  161.  
  162. **
  163. ** Emulation vorbereiten (Sprungtabellen aufbauen)
  164. **
  165.  
  166. ; ReadTabs aufbauen
  167. Init6510    lea    ReadTab0,a0        ;Alle mit RAM vorbelegen
  168.         move.w    #256*8-1,d0
  169. 1$        move.l    #ReadByteRAM,(a0)+
  170.         dbra    d0,1$
  171.  
  172.         move.l    #ReadBytePage0,ReadTab0    ;Zeropage immer speziell
  173.         move.l    #ReadBytePage0,ReadTab1
  174.         move.l    #ReadBytePage0,ReadTab2
  175.         move.l    #ReadBytePage0,ReadTab3
  176.         move.l    #ReadBytePage0,ReadTab4
  177.         move.l    #ReadBytePage0,ReadTab5
  178.         move.l    #ReadBytePage0,ReadTab6
  179.         move.l    #ReadBytePage0,ReadTab7
  180.  
  181.         lea    ReadTab3+160*4,a0    ;Basic-ROM
  182.         moveq    #31,d0
  183. 21$        move.l    #ReadByteBasic,(a0)+
  184.         dbra    d0,21$
  185.  
  186.         lea    ReadTab7+160*4,a0
  187.         moveq    #31,d0
  188. 22$        move.l    #ReadByteBasic,(a0)+
  189.         dbra    d0,22$
  190.  
  191.         lea    ReadTab2+224*4,a0    ;Kernal-ROM
  192.         moveq    #31,d0
  193. 31$        move.l    #ReadByteKernal,(a0)+
  194.         dbra    d0,31$
  195.  
  196.         lea    ReadTab3+224*4,a0
  197.         moveq    #31,d0
  198. 32$        move.l    #ReadByteKernal,(a0)+
  199.         dbra    d0,32$
  200.  
  201.         lea    ReadTab6+224*4,a0
  202.         moveq    #31,d0
  203. 33$        move.l    #ReadByteKernal,(a0)+
  204.         dbra    d0,33$
  205.  
  206.         lea    ReadTab7+224*4,a0
  207.         moveq    #31,d0
  208. 34$        move.l    #ReadByteKernal,(a0)+
  209.         dbra    d0,34$
  210.  
  211.         lea    ReadTab5+208*4,a0    ;I/O-Bereich
  212.         move.l    #ReadByteVIC,(a0)+
  213.         move.l    #ReadByteVIC,(a0)+
  214.         move.l    #ReadByteVIC,(a0)+
  215.         move.l    #ReadByteVIC,(a0)+
  216.         move.l    #ReadByteSID,(a0)+
  217.         move.l    #ReadByteSID,(a0)+
  218.         move.l    #ReadByteSID,(a0)+
  219.         move.l    #ReadByteSID,(a0)+
  220.         move.l    #ReadByteColor,(a0)+
  221.         move.l    #ReadByteColor,(a0)+
  222.         move.l    #ReadByteColor,(a0)+
  223.         move.l    #ReadByteColor,(a0)+
  224.         move.l    #ReadByteCIA1,(a0)+
  225.         move.l    #ReadByteCIA2,(a0)+
  226.         move.l    #ReadByteUndef,(a0)+
  227.         move.l    #ReadByteUndef,(a0)
  228.  
  229.         lea    ReadTab6+208*4,a0
  230.         move.l    #ReadByteVIC,(a0)+
  231.         move.l    #ReadByteVIC,(a0)+
  232.         move.l    #ReadByteVIC,(a0)+
  233.         move.l    #ReadByteVIC,(a0)+
  234.         move.l    #ReadByteSID,(a0)+
  235.         move.l    #ReadByteSID,(a0)+
  236.         move.l    #ReadByteSID,(a0)+
  237.         move.l    #ReadByteSID,(a0)+
  238.         move.l    #ReadByteColor,(a0)+
  239.         move.l    #ReadByteColor,(a0)+
  240.         move.l    #ReadByteColor,(a0)+
  241.         move.l    #ReadByteColor,(a0)+
  242.         move.l    #ReadByteCIA1,(a0)+
  243.         move.l    #ReadByteCIA2,(a0)+
  244.         move.l    #ReadByteUndef,(a0)+
  245.         move.l    #ReadByteUndef,(a0)
  246.  
  247.         lea    ReadTab7+208*4,a0
  248.         move.l    #ReadByteVIC,(a0)+
  249.         move.l    #ReadByteVIC,(a0)+
  250.         move.l    #ReadByteVIC,(a0)+
  251.         move.l    #ReadByteVIC,(a0)+
  252.         move.l    #ReadByteSID,(a0)+
  253.         move.l    #ReadByteSID,(a0)+
  254.         move.l    #ReadByteSID,(a0)+
  255.         move.l    #ReadByteSID,(a0)+
  256.         move.l    #ReadByteColor,(a0)+
  257.         move.l    #ReadByteColor,(a0)+
  258.         move.l    #ReadByteColor,(a0)+
  259.         move.l    #ReadByteColor,(a0)+
  260.         move.l    #ReadByteCIA1,(a0)+
  261.         move.l    #ReadByteCIA2,(a0)+
  262.         move.l    #ReadByteUndef,(a0)+
  263.         move.l    #ReadByteUndef,(a0)
  264.  
  265.         lea    ReadTab1+208*4,a0    ;Char-ROM
  266.         moveq    #15,d0
  267. 41$        move.l    #ReadByteChar,(a0)+
  268.         dbra    d0,41$
  269.  
  270.         lea    ReadTab2+208*4,a0
  271.         moveq    #15,d0
  272. 42$        move.l    #ReadByteChar,(a0)+
  273.         dbra    d0,42$
  274.  
  275.         lea    ReadTab3+208*4,a0
  276.         moveq    #15,d0
  277. 43$        move.l    #ReadByteChar,(a0)+
  278.         dbra    d0,43$
  279.  
  280. ; WriteTabs aufbauen
  281.         lea    WriteTab0,a0        ;Alle mit RAM vorbelegen
  282.         move.w    #256*8-1,d0
  283. 5$        move.l    #WriteByteRAM,(a0)+
  284.         dbra    d0,5$
  285.  
  286.         move.l    #WriteBytePage0,WriteTab0 ;Zeropage immer speziell
  287.         move.l    #WriteBytePage0,WriteTab1
  288.         move.l    #WriteBytePage0,WriteTab2
  289.         move.l    #WriteBytePage0,WriteTab3
  290.         move.l    #WriteBytePage0,WriteTab4
  291.         move.l    #WriteBytePage0,WriteTab5
  292.         move.l    #WriteBytePage0,WriteTab6
  293.         move.l    #WriteBytePage0,WriteTab7
  294.  
  295.         lea    WriteTab5+208*4,a0    ;I/O-Bereich
  296.         move.l    #WriteByteVIC,(a0)+
  297.         move.l    #WriteByteVIC,(a0)+
  298.         move.l    #WriteByteVIC,(a0)+
  299.         move.l    #WriteByteVIC,(a0)+
  300.         move.l    #WriteByteSID,(a0)+
  301.         move.l    #WriteByteSID,(a0)+
  302.         move.l    #WriteByteSID,(a0)+
  303.         move.l    #WriteByteSID,(a0)+
  304.         move.l    #WriteByteColor,(a0)+
  305.         move.l    #WriteByteColor,(a0)+
  306.         move.l    #WriteByteColor,(a0)+
  307.         move.l    #WriteByteColor,(a0)+
  308.         move.l    #WriteByteCIA1,(a0)+
  309.         move.l    #WriteByteCIA2,(a0)+
  310.         move.l    #WriteByteUndef,(a0)+
  311.         move.l    #WriteByteUndef,(a0)
  312.  
  313.         lea    WriteTab6+208*4,a0
  314.         move.l    #WriteByteVIC,(a0)+
  315.         move.l    #WriteByteVIC,(a0)+
  316.         move.l    #WriteByteVIC,(a0)+
  317.         move.l    #WriteByteVIC,(a0)+
  318.         move.l    #WriteByteSID,(a0)+
  319.         move.l    #WriteByteSID,(a0)+
  320.         move.l    #WriteByteSID,(a0)+
  321.         move.l    #WriteByteSID,(a0)+
  322.         move.l    #WriteByteColor,(a0)+
  323.         move.l    #WriteByteColor,(a0)+
  324.         move.l    #WriteByteColor,(a0)+
  325.         move.l    #WriteByteColor,(a0)+
  326.         move.l    #WriteByteCIA1,(a0)+
  327.         move.l    #WriteByteCIA2,(a0)+
  328.         move.l    #WriteByteUndef,(a0)+
  329.         move.l    #WriteByteUndef,(a0)
  330.  
  331.         lea    WriteTab7+208*4,a0
  332.         move.l    #WriteByteVIC,(a0)+
  333.         move.l    #WriteByteVIC,(a0)+
  334.         move.l    #WriteByteVIC,(a0)+
  335.         move.l    #WriteByteVIC,(a0)+
  336.         move.l    #WriteByteSID,(a0)+
  337.         move.l    #WriteByteSID,(a0)+
  338.         move.l    #WriteByteSID,(a0)+
  339.         move.l    #WriteByteSID,(a0)+
  340.         move.l    #WriteByteColor,(a0)+
  341.         move.l    #WriteByteColor,(a0)+
  342.         move.l    #WriteByteColor,(a0)+
  343.         move.l    #WriteByteColor,(a0)+
  344.         move.l    #WriteByteCIA1,(a0)+
  345.         move.l    #WriteByteCIA2,(a0)+
  346.         move.l    #WriteByteUndef,(a0)+
  347.         move.l    #WriteByteUndef,(a0)
  348.         rts
  349.  
  350.  
  351. **
  352. ** 6510 zurücksetzen
  353. **
  354.  
  355. Reset6510    st.b    IntIsRESET
  356.         rts
  357.  
  358.  
  359. **
  360. ** 6510-Task starten
  361. ** Rückgabe: d0#0 = Fehler
  362. **
  363.  
  364. ; Signale einrichten
  365. Start6510    move.l    _SysBase,a6
  366.         moveq    #-1,d0
  367.         JSRLIB    AllocSignal
  368.         move.b    d0,ReadySig
  369.         moveq    #0,d1
  370.         bset    d0,d1
  371.         move.l    d1,ReadySet
  372.  
  373.         moveq    #-1,d0
  374.         JSRLIB    AllocSignal
  375.         move.b    d0,InvokeSAMSig
  376.         moveq    #0,d1
  377.         bset    d0,d1
  378.         move.l    d1,InvokeSAMSet
  379.  
  380. ; Task starten
  381.         move.l    _DOSBase,a6
  382.         move.l    #ProcTags,d1
  383.         JSRLIB    CreateNewProc
  384.         move.l    d0,CPUProc
  385.         beq    1$
  386.  
  387. ; Auf Signal warten
  388.         move.l    _SysBase,a6
  389.         move.l    ReadySet,d0
  390.         JSRLIB    Wait
  391.         moveq    #0,d0        ;Alles OK
  392.         rts
  393.  
  394. ; Fehler aufgetreten
  395. 1$        moveq    #-1,d0
  396.         rts
  397.  
  398.  
  399. **
  400. ** 6510-Task stoppen
  401. **
  402.  
  403. ; Task stoppen
  404. Stop6510    move.l    _SysBase,a6
  405.         tst.l    CPUProc
  406.         beq    1$
  407.         st    RESETIsEXIT    ;EXIT-Reset auslösen
  408.         st    IntIsRESET
  409.         move.l    ReadySet,d0
  410.         JSRLIB    Wait
  411.  
  412. ; Signale freigeben
  413. 1$        move.b    InvokeSAMSig,d0
  414.         JSRLIB    FreeSignal
  415.  
  416.         move.b    ReadySig,d0
  417.         JMPLIB    FreeSignal
  418.  
  419.  
  420. **
  421. ** 6510-Task anhalten, Zustand sichern
  422. **
  423.  
  424. _Pause6510    move.l    a6,-(sp)
  425.         move.l    _SysBase,a6
  426.         st    RESETIsPause    ;Pause-Reset auslösen
  427.         st    IntIsRESET
  428.         move.l    ReadySet,d0
  429.         JSRLIB    Wait
  430.         move.l    (sp)+,a6
  431.         rts
  432.  
  433.  
  434. **
  435. ** 6510-Task fortsetzen, Zustand übernehmen
  436. **
  437.  
  438. _Resume6510    move.l    a6,-(sp)
  439.         move.l    _SysBase,a6
  440.         move.l    CPUTask,a1    ;Continue-Signal schicken
  441.         move.l    ContinueSet,d0
  442.         JSRLIB    Signal
  443.         move.l    (sp)+,a6
  444.         rts
  445.  
  446.  
  447. **
  448. ** Byte lesen (für SAM)
  449. **
  450.  
  451. _SAMReadByte    moveq    #0,d0
  452.         move.w    6(sp),d0
  453.         movem.l    d2/a4/RAMPTR,-(sp)
  454.         lea    _DATA_BAS_,a4
  455.         lea    32766(a4),a4
  456.         move.l    TheRAMPTR,RAMPTR
  457.         move.l    d0,d1
  458.         lsr.w    #8,d1
  459.         move.b    _SAMMemConfig,d2
  460.         and.w    #7,d2
  461.         move.l    (ConfigTab,d2.w*8),a0
  462.         move.l    (a0,d1.w*4),a0
  463.         jsr    (a0)
  464.         movem.l    (sp)+,d2/a4/RAMPTR
  465.         rts
  466.  
  467.  
  468. **
  469. ** Byte schreiben (für SAM)
  470. **
  471.  
  472. _SAMWriteByte    moveq    #0,d0
  473.         move.w    6(sp),d0
  474.         move.l    8(sp),d1
  475.         cmp.w    #$d000,d0
  476.         blo    1$
  477.         movem.l    d2/a4/RAMPTR,-(sp)
  478.         lea    _DATA_BAS_,a4
  479.         lea    32766(a4),a4
  480.         move.l    TheRAMPTR,RAMPTR
  481.         move.b    _SAMMemConfig,d2
  482.         and.w    #7,d2
  483.         move.l    (ConfigTab+4,d2.w*8),a0
  484.         move.l    d0,d2
  485.         lsr.w    #8,d2
  486.         move.l    (a0,d2.w*4),a0
  487.         jsr    (a0)
  488.         movem.l    (sp)+,d2/a4/RAMPTR
  489.         rts
  490. 1$        move.l    TheRAMPTR,a0
  491.         move.b    d1,(a0,d0.w)
  492.         rts
  493.  
  494.  
  495. **
  496. ** Strings in Datenstrukturen lokalisieren
  497. **
  498.  
  499. GetStr        MACRO    ;Label
  500.         lea    TheLocale,a0
  501.         move.l    #\1,d0
  502.         jsr    GetString
  503.         ENDM
  504.  
  505. Localize6510    GetStr    MSG_REQTITLE
  506.         move.l    d0,IllegalOpReq+8
  507.  
  508.         GetStr    MSG_REQGADS6
  509.         move.l    d0,IllegalOpReq+16
  510.  
  511.         GetStr    MSG_ILLEGALOP
  512.         move.l    d0,IllegalOpReq+12
  513.         rts
  514.  
  515.  
  516. **
  517. ** 6510-Emulator
  518. **
  519.  
  520.         NEAR
  521.  
  522. *
  523. * Makros
  524. *
  525.  
  526. ; Speicherkonfiguration neu einstellen
  527. NewConfig    MACRO
  528.         move.b    RDDR,d0        ;Zustand der Ausgabepins lesen
  529.         not.b    d0        ;Eingabepins sind 1
  530.         or.b    RPR,d0
  531.         and.w    #7,d0        ;Relevante Bits maskieren
  532.         move.l    (ConfigTab,d0.w*8),RDTAB
  533.         move.l    (ConfigTab+4,d0.w*8),WRTAB
  534.         ENDM
  535.  
  536. ; Abschluß einer Zyklusroutine, Fortsetzungszeiger setzen
  537. Next        MACRO    ;Nächste Routine
  538.         lea    \1,CONT
  539.         rts
  540.         ENDM
  541.  
  542. ; Abschluß eines Opcodes, im nächsten Zyklus neuen Opcode lesen
  543. Last        MACRO
  544.         Next    Fetch
  545.         ENDM
  546.  
  547. ; Anfang eines Opcodes, Zeiger auf ersten Zyklus holen
  548. Execute        MACRO
  549.         ReadPCInc
  550.         and.w    #$00ff,d0
  551.         move.l    (OpcodeTable,d0.w*4),CONT
  552.         rts
  553.         ENDM
  554.  
  555. ; Stackzeiger erhöhen
  556. IncS        MACRO
  557.         addq.b    #1,RS+1
  558.         ENDM
  559.  
  560. ; Stackzeiger erniedrigen
  561. DecS        MACRO
  562.         subq.b    #1,RS+1
  563.         ENDM
  564.  
  565. ; Byte bei (PC) lesen
  566. ReadPC        MACRO    ;[Ziel]
  567.         move.w    RPC,d0
  568.         bsr    ReadByte
  569.     IFGE    NARG-1
  570.         move.b    d0,\1
  571.     ENDC
  572.         ENDM
  573.  
  574. ; Byte bei (PC) lesen und PC inkrementieren
  575. ReadPCInc    MACRO    ;[Ziel]
  576.         move.w    RPC,d0
  577.         bsr    ReadByte
  578.         addq.w    #1,RPC
  579.     IFGE    NARG-1
  580.         move.b    d0,\1
  581.     ENDC
  582.         ENDM
  583.  
  584. ; Byte bei (ADR) lesen
  585. ReadADR        MACRO    ;[Ziel]
  586.         move.w    RADR,d0
  587.         bsr    ReadByte
  588.     IFGE    NARG-1
  589.         move.b    d0,\1
  590.     ENDC
  591.         ENDM
  592.  
  593. ; Byte bei (ADR2) lesen
  594. ReadADR2    MACRO    ;[Ziel]
  595.         move.w    RADR2,d0
  596.         bsr    ReadByte
  597.     IFGE    NARG-1
  598.         move.b    d0,\1
  599.     ENDC
  600.         ENDM
  601.  
  602. ; Byte bei $0100,S lesen
  603. ReadStack    MACRO    ;[Ziel]
  604.         move.w    RS,d0        ;S ist ja 16-Bit, $01xx
  605.         bsr    ReadByte
  606.     IFGE    NARG-1
  607.         move.b    d0,\1
  608.     ENDC
  609.         ENDM
  610.  
  611. ; Status vom Stack holen
  612. PopP        MACRO
  613.         ReadStack
  614.         clr.b    RCCR+1
  615.         tst.b    d0        ;N holen
  616.         bpl    PopPNoN\@
  617.         or.b    #$08,RCCR+1
  618. PopPNoN\@    add.b    d0,d0        ;V holen
  619.         smi    ROVERFLOW
  620.         lsl.b    #3,d0        ;D holen
  621.         smi    RDECIMAL
  622.         add.b    d0,d0        ;I holen
  623.         smi    RINTERRUPT
  624.         add.b    d0,d0        ;Z holen
  625.         bpl    PopPNoZ\@
  626.         or.b    #$04,RCCR+1
  627. PopPNoZ\@    add.b    d0,d0        ;C holen
  628.         smi    RCARRY
  629.         ENDM
  630.  
  631. ; Byte nach (ADR) schreiben
  632. WriteADR    MACRO    ;Quelle
  633.         move.w    RADR,d0
  634.         move.b    \1,d1
  635.         bsr    WriteByte
  636.         ENDM
  637.  
  638. ; Byte nach $0100,S schreiben
  639. WriteStack    MACRO    ;[Quelle]
  640.         move.w    RS,d0
  641.     IFGE    NARG-1
  642.         move.b    \1,d1
  643.     ENDC
  644.         bsr    WriteByte
  645.         ENDM
  646.  
  647. ; Status auf den Stack legen
  648. PushP        MACRO    ;Break-Bit
  649.         moveq    #0,d1
  650.         move.w    RS,d0
  651.         btst    #3,RCCR+1    ;N dazunehmen
  652.         beq    PushPNoN\@
  653.         or.b    #$80,d1
  654. PushPNoN\@    tst.b    ROVERFLOW    ;V dazunehmen
  655.         beq    PushPNoV\@
  656.         or.b    #$40,d1
  657. PushPNoV\@    tst.b    RDECIMAL    ;D dazunehmen
  658.         beq    PushPNoD\@
  659.         or.b    #$08,d1
  660. PushPNoD\@    tst.b    RINTERRUPT    ;I dazunehmen
  661.         beq    PushPNoI\@
  662.         or.b    #$04,d1
  663. PushPNoI\@    btst    #2,RCCR+1    ;Z dazunehmen
  664.         beq    PushPNoZ\@
  665.         or.b    #$02,d1
  666. PushPNoZ\@    tst.b    RCARRY        ;C dazunehmen
  667.         beq    PushPNoC\@
  668.         or.b    #$01,d1
  669. PushPNoC\@    
  670.     IFEQ    \1
  671.         or.b    #$20,d1        ;1 setzen
  672.     ELSE
  673.         or.b    #$30,d1        ;B und 1 setzen
  674.     ENDC
  675.         bsr    WriteByte        
  676.         DecS
  677.         ENDM
  678.  
  679. ; Zyklus 2: Byte über unmittelbare Adressierung lesen
  680. ReadByteImm    MACRO    ;[Ziel]
  681.         ReadPCInc \1
  682.         ENDM
  683.  
  684. ; Zyklus 2: Adresse für Zero-Page-Adressierung nach ADR lesen
  685. ReadAdrZero    MACRO    ;Name des Opcodes
  686.         ReadPCInc RADRL
  687.         clr.b    RADRH
  688.         Next    \1_3
  689. \1_3
  690.         ENDM
  691.  
  692. ; Zyklus 2/3: Byte über Zero-Page-Adressierung lesen
  693. ReadByteZero    MACRO    ;Name des Opcodes, [Ziel]
  694.         ReadAdrZero \1
  695.         ReadADR    \2
  696.         ENDM
  697.  
  698. ; Zyklus 2/3/4: Byte über Zero-Page-Adressierung nach RDBUF lesen und zurückschreiben
  699. ReadRMWZero    MACRO    ;Name des Opcodes
  700.         ReadAdrZero \1
  701.         ReadADR    RDBUF
  702.         Next    \1_4
  703. \1_4        WriteADR RDBUF
  704.         Next    \1_5
  705. \1_5
  706.         ENDM
  707.  
  708. ; Zyklus 2/3: Adresse für X-indizierte Zero-Page-Adressierung nach ADR lesen
  709. ReadAdrZeroX    MACRO    ;Name des Opcodes
  710.         ReadPCInc RADRL
  711.         clr.b    RADRH
  712.         Next    \1_3
  713. \1_3        ReadADR
  714.         move.b    RX,d0
  715.         add.b    d0,RADRL    ;Keine Seitenüberschreitung
  716.         Next    \1_4
  717. \1_4
  718.         ENDM
  719.  
  720. ; Zyklus 2/3/4: Byte über X-indizierte Zero-Page-Adressierung lesen
  721. ReadByteZeroX    MACRO    ;Name des Opcodes, [Ziel]
  722.         ReadAdrZeroX \1
  723.         ReadADR    \2
  724.         ENDM
  725.  
  726. ; Zyklus 2/3/4/5: Byte über X-indizierte Zero-Page-Adressierung nach RDBUF lesen und zurückschreiben
  727. ReadRMWZeroX    MACRO    ;Name des Opcodes
  728.         ReadAdrZeroX \1
  729.         ReadADR    RDBUF
  730.         Next    \1_5
  731. \1_5        WriteADR RDBUF
  732.         Next    \1_6
  733. \1_6
  734.         ENDM
  735.  
  736. ; Zyklus 2/3: Adresse für Y-indizierte Zero-Page-Adressierung nach ADR lesen
  737. ReadAdrZeroY    MACRO    ;Name des Opcodes
  738.         ReadPCInc RADRL
  739.         clr.b    RADRH
  740.         Next    \1_3
  741. \1_3        ReadADR
  742.         move.b    RY,d0
  743.         add.b    d0,RADRL    ;Keine Seitenüberschreitung
  744.         Next    \1_4
  745. \1_4
  746.         ENDM
  747.  
  748. ; Zyklus 2/3/4: Byte über Y-indizierte Zero-Page-Adressierung lesen
  749. ReadByteZeroY    MACRO    ;Name des Opcodes, [Ziel]
  750.         ReadAdrZeroY \1
  751.         ReadADR    \2
  752.         ENDM
  753.  
  754. ; Zyklus 2/3: Adresse für absolute Adressierung nach ADR lesen
  755. ReadAdrAbs    MACRO    ;Name des Opcodes
  756.         ReadPCInc RADRL
  757.         Next    \1_3
  758. \1_3        ReadPCInc RADRH
  759.         Next    \1_4
  760. \1_4
  761.         ENDM
  762.  
  763. ; Zyklus 2/3/4: Byte über absolute Adressierung lesen
  764. ReadByteAbs    MACRO    ;Name des Opcodes, [Ziel]
  765.         ReadAdrAbs \1
  766.         ReadADR    \2
  767.         ENDM
  768.  
  769. ; Zyklus 2/3/4/5: Byte über absolute Adressierung nach RDBUF lesen und zurückschreiben
  770. ReadRMWAbs    MACRO    ;Name des Opcodes
  771.         ReadAdrAbs \1
  772.         ReadADR    RDBUF
  773.         Next    \1_5
  774. \1_5        WriteADR RDBUF
  775.         Next    \1_6
  776. \1_6
  777.         ENDM
  778.  
  779. ; Zyklus 2/3/4: Adresse für X-indizierte absolute Adressierung nach ADR lesen
  780. ;  Kein Extrazyklus bei Seitenüberschreitung
  781. ReadAdrAbsX    MACRO    ;Name des Opcodes
  782.         ReadPCInc RADRL
  783.         Next    \1_3
  784. \1_3        ReadPCInc RADRH
  785.         move.b    RX,d0
  786.         add.b    d0,RADRL
  787.         bcs    \@1$        ;Seitenüberschreitung?
  788.         Next    \1_4a
  789. \@1$        Next    \1_4b
  790. \1_4a        ReadADR            ;Nein, von Adresse lesen
  791.         Next    \1_5
  792. \1_4b        ReadADR            ;Ja, von falscher Adresse lesen
  793.         addq.b    #1,RADRH    ; und Adresse korrigieren
  794.         Next    \1_5
  795. \1_5
  796.         ENDM
  797.  
  798. ; Zyklus 2/3/(4)/5: Byte über X-indizierte absolute Adressierung lesen
  799. ;  Extrazyklus bei Seitenüberschreitung
  800. ReadByteAbsX    MACRO    ;Name des Opcodes, [Ziel]
  801.         ReadPCInc RADRL
  802.         Next    \1_3
  803. \1_3        ReadPCInc RADRH
  804.         move.b    RX,d0
  805.         add.b    d0,RADRL
  806.         bcs    \@1$        ;Seitenüberschreitung?
  807.         Next    \1_5
  808. \@1$        Next    \1_4
  809. \1_4        ReadADR            ;Ja, erst von falscher Adresse lesen
  810.         addq.b    #1,RADRH    ; und Adresse korrigieren
  811.         Next    \1_5
  812. \1_5        ReadADR    \2        ;Byte lesen
  813.         ENDM
  814.  
  815. ; Zyklus 2/3/4/5/6: Byte über X-indizierte absolute Adressierung nach RDBUF lesen und zurückschreiben
  816. ;  Kein Extrazyklus bei Seitenüberschreitung
  817. ReadRMWAbsX    MACRO    ;Name des Opcodes
  818.         ReadAdrAbsX \1
  819.         ReadADR    RDBUF
  820.         Next    \1_6
  821. \1_6        WriteADR RDBUF
  822.         Next    \1_7
  823. \1_7
  824.         ENDM
  825.  
  826. ; Zyklus 2/3/4: Adresse für Y-indizierte absolute Adressierung nach ADR lesen
  827. ;  Kein Extrazyklus bei Seitenüberschreitung
  828. ReadAdrAbsY    MACRO    ;Name des Opcodes
  829.         ReadPCInc RADRL
  830.         Next    \1_3
  831. \1_3        ReadPCInc RADRH
  832.         move.b    RY,d0
  833.         add.b    d0,RADRL
  834.         bcs    \@1$        ;Seitenüberschreitung?
  835.         Next    \1_4a
  836. \@1$        Next    \1_4b
  837. \1_4a        ReadADR            ;Nein, von Adresse lesen (unnötig)
  838.         Next    \1_5
  839. \1_4b        ReadADR            ;Ja, von falscher Adresse lesen
  840.         addq.b    #1,RADRH    ; und Adresse korrigieren
  841.         Next    \1_5
  842. \1_5
  843.         ENDM
  844.  
  845. ; Zyklus 2/3/(4)/5: Byte über Y-indizierte absolute Adressierung lesen
  846. ;  Extrazyklus bei Seitenüberschreitung
  847. ReadByteAbsY    MACRO    ;Name des Opcodes, [Ziel]
  848.         ReadPCInc RADRL
  849.         Next    \1_3
  850. \1_3        ReadPCInc RADRH
  851.         move.b    RY,d0
  852.         add.b    d0,RADRL
  853.         bcs    \@1$        ;Seitenüberschreitung?
  854.         Next    \1_5
  855. \@1$        Next    \1_4
  856. \1_4        ReadADR            ;Ja, erst von falscher Adresse lesen
  857.         addq.b    #1,RADRH    ; und Adresse korrigieren
  858.         Next    \1_5
  859. \1_5        ReadADR    \2        ;Byte lesen
  860.         ENDM
  861.  
  862. ; Zyklus 2/3/4/5/6: Byte über Y-indizierte absolute Adressierung nach RDBUF lesen und zurückschreiben
  863. ;  Kein Extrazyklus bei Seitenüberschreitung
  864. ReadRMWAbsY    MACRO    ;Name des Opcodes
  865.         ReadAdrAbsY \1
  866.         ReadADR    RDBUF
  867.         Next    \1_6
  868. \1_6        WriteADR RDBUF
  869.         Next    \1_7
  870. \1_7
  871.         ENDM
  872.  
  873. ; Zyklus 2/3/4/5: Adresse für indiziert-indirekte Adressierung nach ADR lesen
  874. ReadAdrIndX    MACRO    ;Name des Opcodes
  875.         ReadPCInc RADR2L
  876.         clr.b    RADR2H
  877.         Next    \1_3
  878. \1_3        ReadADR2
  879.         move.b    RX,d0
  880.         add.b    d0,RADR2L
  881.         Next    \1_4
  882. \1_4        ReadADR2 RADRL
  883.         addq.b    #1,RADR2L    ;Keine Seitenüberschreitung
  884.         Next    \1_5
  885. \1_5        ReadADR2 RADRH
  886.         Next    \1_6
  887. \1_6
  888.         ENDM
  889.  
  890. ; Zyklus 2/3/4/5/6: Byte über indiziert-indirekte Adressierung lesen
  891. ReadByteIndX    MACRO    ;Name des Opcodes, [Ziel]
  892.         ReadAdrIndX \1
  893.         ReadADR    \2
  894.         ENDM
  895.  
  896. ; Zyklus 2/3/4/5/6/7: Byte über indiziert-indirekte Adressierung nach RDBUF lesen und zurückschreiben
  897. ReadRMWIndX    MACRO    ;Name des Opcodes
  898.         ReadAdrIndX \1
  899.         ReadADR    RDBUF
  900.         Next    \1_7
  901. \1_7        WriteADR RDBUF
  902.         Next    \1_8
  903. \1_8
  904.         ENDM
  905.  
  906. ; Zyklus 2/3/4/5: Adresse für indirekt-indizierte Adressierung nach ADR lesen
  907. ;  Kein Extrazyklus bei Seitenüberschreitung
  908. ReadAdrIndY    MACRO    ;Name des Opcodes
  909.         ReadPCInc RADR2L
  910.         clr.b    RADR2H
  911.         Next    \1_3
  912. \1_3        ReadADR2 RADRL
  913.         addq.b    #1,RADR2L    ;Keine Seitenüberschreitung
  914.         Next    \1_4
  915. \1_4        ReadADR2 RADRH
  916.         move.b    RY,d0
  917.         add.b    d0,RADRL
  918.         bcs    \@1$        ;Seitenüberschreitung?
  919.         Next    \1_5a
  920. \@1$        Next    \1_5b
  921. \1_5a        ReadADR            ;Nein, von Adresse lesen (unnötig)
  922.         Next    \1_6
  923. \1_5b        ReadADR            ;Ja, von falscher Adresse lesen
  924.         addq.b    #1,RADRH    ; und Adresse korrigieren
  925.         Next    \1_6
  926. \1_6
  927.         ENDM
  928.  
  929. ; Zyklus 2/3/4/(5)/6: Byte über indirekt-indizierte Adressierung lesen
  930. ;  Extrazyklus bei Seitenüberschreitung
  931. ReadByteIndY    MACRO    ;Name des Opcodes, [Ziel]
  932.         ReadPCInc RADR2L
  933.         clr.b    RADR2H
  934.         Next    \1_3
  935. \1_3        ReadADR2 RADRL
  936.         addq.b    #1,RADR2L    ;Keine Seitenüberschreitung
  937.         Next    \1_4
  938. \1_4        ReadADR2 RADRH
  939.         move.b    RY,d0
  940.         add.b    d0,RADRL
  941.         bcs    \@1$        ;Seitenüberschreitung?
  942.         Next    \1_6
  943. \@1$        Next    \1_5
  944. \1_5        ReadADR            ;Ja, erst von falscher Adresse lesen
  945.         addq.b    #1,RADRH    ; und Adresse korrigieren
  946.         Next    \1_6
  947. \1_6        ReadADR    \2        ;Byte lesen
  948.         ENDM
  949.  
  950. ; Zyklus 2/3/4/5/6/7: Byte über indirekt-indizierte Adressierung nach RDBUF lesen und zurückschreiben
  951. ;  Kein Extrazyklus bei Seitenüberschreitung
  952. ReadRMWIndY    MACRO    ;Name des Opcodes
  953.         ReadAdrIndY \1
  954.         ReadADR    RDBUF
  955.         Next    \1_7
  956. \1_7        WriteADR RDBUF
  957.         Next    \1_8
  958. \1_8
  959.         ENDM
  960.  
  961. *
  962. * Byte lesen
  963. *
  964.  
  965. ; Ein Byte von der CPU aus lesen
  966. ; -> d0.w: Adresse
  967. ; <- d0.b: Byte
  968. ReadByte    tst.b    BALow        ;BA low?
  969.         bne    ReadBAIsLow
  970.  
  971.     IFNE    DEBUG_DETAIL
  972.     tst.b    DEBUGON
  973.     beq    1$
  974.     move.l    d0,-(sp)
  975.     bsr    1$
  976.     move.l    (sp)+,d1
  977.     and.l    #$00ff,d0
  978.     and.l    #$ffff,d1
  979.     DPRINTF    "CPU Read %04lx -> #%02lx",d1,d0
  980.     rts
  981. 1$
  982.     ENDC
  983.  
  984.         move.w    d0,d1        ;Nein, Lesezugriff ausführen
  985.         lsr.w    #8,d1
  986.         move.l    RDTAB,a0
  987.         move.l    (a0,d1.w*4),a0
  988.         jmp    (a0)
  989.  
  990. ReadBAIsLow    move.w    d0,HALTADRSTORE    ;Sonst Register retten
  991.         move.l    CONT,HALTCONTSTORE
  992.         move.l    (sp)+,HALTRETADR
  993.     IFNE    DEBUG_DETAIL
  994.     tst.b    DEBUGON
  995.     beq    1$
  996.     DPRINTF    "CPU Halted (RDY 1->0)"
  997. 1$
  998.     ENDC
  999.         Next    ReadCheckBA    ;und in Warteschleife gehen
  1000.  
  1001. ReadCheckBA    tst.b    BALow        ;Nächster Zyklus: BA immer noch low?
  1002.         beq    ReadBADone
  1003.     IFNE    DEBUG_DETAIL
  1004.     tst.b    DEBUGON
  1005.     beq    1$
  1006.     DPRINTF    "CPU Halted (RDY 0)"
  1007. 1$
  1008.     ENDC
  1009.         Next    ReadCheckBA    ;Ja, weiter warten
  1010.  
  1011. ReadBADone    move.w    HALTADRSTORE,d0    ;Nein, Register wieder holen
  1012.         move.l    HALTCONTSTORE,CONT
  1013.         move.w    d0,d1
  1014.         move.l    HALTRETADR,-(sp)
  1015.  
  1016.     IFNE    DEBUG_DETAIL
  1017.     tst.b    DEBUGON
  1018.     beq    1$
  1019.     move.l    d0,-(sp)
  1020.     bsr    1$
  1021.     move.l    (sp)+,d1
  1022.     and.l    #$00ff,d0
  1023.     and.l    #$ffff,d1
  1024.     DPRINTF    "CPU Read %04lx -> #%02lx",d1,d0
  1025.     rts
  1026. 1$
  1027.     ENDC
  1028.  
  1029.         lsr.w    #8,d1
  1030.         move.l    RDTAB,a0
  1031.         move.l    (a0,d1.w*4),a0
  1032.         jmp    (a0)
  1033.  
  1034. ReadBytePage0    cmp.w    #2,d0
  1035.         bhs    ReadByteRAM
  1036.         tst.w    d0        ;Adresse 0: DDR
  1037.         bne    1$
  1038.         move.b    RDDR,d0
  1039.         rts
  1040. 1$        move.b    RDDR,d0        ;Adresse 1: PR
  1041.         move.b    d0,d1
  1042.         not.b    d1
  1043.         and.b    RPR,d0
  1044.         and.b    #%00010111,d1    ;Eingabepins
  1045.         or.b    d1,d0
  1046.         rts
  1047.  
  1048. ReadByteRAM    move.b    (RAMPTR,d0.w),d0
  1049.         rts
  1050.  
  1051. ReadByteBasic    and.w    #$1fff,d0
  1052.         move.l    TheBasic,a0
  1053.         move.b    (a0,d0.w),d0
  1054.         rts
  1055.  
  1056. ReadByteVIC    and.w    #$3f,d0
  1057.         bra    ReadFrom6569
  1058.  
  1059. ReadByteSID    and.w    #$1f,d0
  1060.         jmp    ReadFrom6581
  1061.  
  1062. ReadByteColor    and.w    #$03ff,d0
  1063.         move.l    TheColor,a0
  1064.         move.b    (a0,d0.w),d0
  1065.         and.b    #$0f,d0
  1066.     IFNE    DE00_COMPATIBLE
  1067.         move.b    LastVICByte,d1    ;Oberes Nibble kommt vom VIC
  1068.         and.b    #$f0,d1
  1069.         or.b    d1,d0
  1070.     ENDC
  1071.         rts
  1072.  
  1073. ReadByteCIA1    and.w    #$0f,d0
  1074.         bra    ReadFrom6526A
  1075.  
  1076. ReadByteCIA2    and.w    #$0f,d0
  1077.         bra    ReadFrom6526B
  1078.  
  1079. ReadByteUndef
  1080.     IFNE    DE00_COMPATIBLE
  1081.         move.b    LastVICByte,d0
  1082.     ELSE
  1083.         move.b    #$aa,d0
  1084.     ENDC
  1085.         rts
  1086.  
  1087. ReadByteKernal    and.w    #$1fff,d0
  1088.         move.l    TheKernal,a0
  1089.         move.b    (a0,d0.w),d0
  1090.         rts
  1091.  
  1092. ReadByteChar    and.w    #$0fff,d0
  1093.         move.l    TheChar,a0
  1094.         move.b    (a0,d0.w),d0
  1095.         rts
  1096.  
  1097.  
  1098. *
  1099. * Byte schreiben
  1100. *
  1101.  
  1102. ; Ein Byte von der CPU aus schreiben
  1103. ; -> d0.w: Adresse
  1104. ; -> d1.b: Byte
  1105. WriteByte
  1106.     IFNE    DEBUG_DETAIL
  1107.     tst.b    DEBUGON
  1108.     beq    1$
  1109.     and.l    #$ffff,d0
  1110.     and.l    #$00ff,d1
  1111.     DPRINTF    "CPU Write #%02lx -> %04lx",d1,d0
  1112. 1$
  1113.     ENDC
  1114.  
  1115.         move.w    d0,d2
  1116.         lsr.w    #8,d2
  1117.         move.l    WRTAB,a0
  1118.         move.l    (a0,d2.w*4),a0
  1119.         jmp    (a0)
  1120.  
  1121. WriteBytePage0    cmp.w    #2,d0
  1122.         bhs    WriteByteRAM
  1123.         tst.w    d0
  1124.         bne    1$
  1125.         move.b    d1,RDDR        ;Adresse 0: DDR
  1126.     IFNE    DE00_COMPATIBLE
  1127.         move.b    LastVICByte,(RAMPTR)
  1128.     ENDC
  1129.         NewConfig
  1130.         rts
  1131. 1$        move.b    d1,RPR        ;Adresse 1: PR
  1132.     IFNE    DE00_COMPATIBLE
  1133.         move.b    LastVICByte,1(RAMPTR)
  1134.     ENDC
  1135.         NewConfig
  1136.         rts
  1137.  
  1138. WriteByteRAM    move.b    d1,(RAMPTR,d0.w)
  1139.         rts
  1140.  
  1141. WriteByteVIC    and.w    #$3f,d0
  1142.         bra    WriteTo6569
  1143.  
  1144. WriteByteSID    and.w    #$1f,d0
  1145.         jmp    WriteTo6581
  1146.  
  1147. WriteByteColor    and.w    #$03ff,d0
  1148.         move.l    TheColor,a0
  1149.         move.b    d1,(a0,d0.w)
  1150.         rts
  1151.  
  1152. WriteByteCIA1    and.w    #$0f,d0
  1153.         bra    WriteTo6526A
  1154.  
  1155. WriteByteCIA2    and.w    #$0f,d0
  1156.         bra    WriteTo6526B
  1157.  
  1158. WriteByteUndef    rts
  1159.  
  1160.  
  1161. *
  1162. * Start
  1163. *
  1164.  
  1165. ; Near-Adressierung initialisieren
  1166. CPUTaskProc    lea    _DATA_BAS_,a4
  1167.         lea    32766(a4),a4
  1168.  
  1169. ; Stackpointer retten
  1170.         move.l    a7,InitialSP
  1171.  
  1172. ; Task ermitteln
  1173.         move.l    _SysBase,a6
  1174.         sub.l    a1,a1
  1175.         JSRLIB    FindTask
  1176.         move.l    d0,CPUTask
  1177.  
  1178. ; Continue-Signal holen
  1179.         moveq    #-1,d0
  1180.         JSRLIB    AllocSignal
  1181.         move.b    d0,ContinueSig
  1182.         moveq    #0,d1
  1183.         bset    d0,d1
  1184.         move.l    d1,ContinueSet
  1185.  
  1186. ; Grafik initialisieren
  1187.         jsr    _InitDisplayFrom6510
  1188.  
  1189. ; Signal an den Emulator schicken
  1190.         move.l    _SysBase,a6
  1191.         move.l    MainTask,a1
  1192.         move.l    ReadySet,d0
  1193.         JSRLIB    Signal
  1194.  
  1195. ; RAM mit Einschaltmuster initialisieren
  1196.         move.l    TheRAM,d0
  1197.         add.l    #$8000,d0
  1198.         move.l    d0,TheRAMPTR
  1199.  
  1200.         move.l    TheRAM,a0
  1201.         move.w    #511,d1
  1202. 3$        moveq    #63,d0
  1203. 1$        clr.b    (a0)+        ;Abwechselnd 64 Bytes $00
  1204.         dbra    d0,1$
  1205.         moveq    #63,d0
  1206. 2$        st    (a0)+        ;Und 64 Bytes $ff
  1207.         dbra    d0,2$
  1208.         dbra    d1,3$
  1209.  
  1210. ; Farb-RAM mit Zufallswerten initialisieren
  1211.         move.l    TheColor,a2
  1212.         move.w    #$03ff,d2
  1213. 4$        jsr    Random
  1214.         move.b    d0,(a2)+
  1215.         dbra    d2,4$
  1216.  
  1217. ; Prozessor initilisieren
  1218.         move.l    TheRAMPTR,RAMPTR
  1219.  
  1220.         clr.l    Interrupt    ;Interrupts aus
  1221.         clr.b    RESETIsEXIT
  1222.         clr.b    RESETIsPause
  1223.         clr.b    NMIState
  1224.  
  1225.         clr.b    RA        ;Register löschen
  1226.         clr.b    RX
  1227.         clr.b    RY
  1228.         move.w    #$01ff,RS
  1229.         clr.w    RCCR
  1230.         st    RINTERRUPT
  1231.         clr.b    RDECIMAL
  1232.         clr.b    RCARRY
  1233.         clr.w    RADR
  1234.  
  1235.         clr.b    RDDR        ;Speicherkonfiguration einstellen
  1236.         clr.b    RPR
  1237.         NewConfig
  1238.  
  1239.         clr.b    BALow
  1240.  
  1241. ; Reset-Vektor lesen, PC setzen und für ersten Befehl vorbereiten
  1242.         move.w    #$fffd,d0
  1243.         bsr    ReadByte
  1244.         move.b    d0,RPC
  1245.         lsl.w    #8,RPC
  1246.         move.w    #$fffc,d0
  1247.         bsr    ReadByte
  1248.         move.b    d0,RPC
  1249.         lea    Fetch,CONT
  1250.  
  1251. ; Ab jetzt kontrolliert der VIC alles
  1252.         bra    Main6569
  1253.  
  1254.  
  1255. *
  1256. * Opcode lesen
  1257. *
  1258.  
  1259. Fetch
  1260.     IFNE    DEBUG_DETAIL
  1261.     cmp.w    #DEBUG_PC,RPC
  1262.     bne    1$
  1263.     st    DEBUGON
  1264. 1$
  1265.     ENDC
  1266.  
  1267.         tst.l    Interrupt
  1268.         bne    HandleInt
  1269.         Execute
  1270.  
  1271.  
  1272. *
  1273. * Ungültiger Opcode
  1274. *
  1275.  
  1276. ; Unbekannten Opcode entdeckt: Requester darstellen
  1277. IllegalOp    subq.w    #1,RPC            ;PC korrigieren
  1278.         movem.l    a2-a6,-(sp)
  1279.  
  1280.         ReadPC
  1281.         and.w    #$00ff,d0
  1282.         move.w    d0,RequestStream    ;Opcode
  1283.         move.w    RPC,RequestStream+2    ;und PC anzeigen
  1284.  
  1285.         jsr    _EmulToBack
  1286.  
  1287.         move.l    _IntuitionBase,a6
  1288.         sub.l    a0,a0
  1289.         lea    IllegalOpReq,a1
  1290.         move.l    a0,a2
  1291.         lea    RequestStream,a3
  1292.         JSRLIB    EasyRequestArgs
  1293.  
  1294.         move.l    d0,-(sp)
  1295.         jsr    _EmulToFront
  1296.         move.l    (sp)+,d0
  1297.  
  1298.         movem.l    (sp)+,a2-a6
  1299.  
  1300.         tst.l    d0
  1301.         beq    1$
  1302.         jsr    ResetC64        ;Ja
  1303.         Last
  1304.  
  1305. 1$        move.l    a6,-(sp)        ;Nein, SAM aufrufen
  1306.         move.l    _SysBase,a6
  1307.         move.l    MainTask,a1        ;Den Haupttask benachrichtigen
  1308.         move.l    InvokeSAMSet,d0
  1309.         JSRLIB    Signal
  1310.         move.l    (sp)+,a6
  1311.         bsr    Pause            ;In Pause-Zustand gehen
  1312.         clr.b    IntIsRESET
  1313.         clr.b    RESETIsPause
  1314.         NewConfig
  1315.         bra    Fetch
  1316.  
  1317.  
  1318. *
  1319. * Interrupts handhaben
  1320. *
  1321.  
  1322. ; Art des Interrupt feststellen (Priorität)
  1323. HandleInt    tst.b    IntIsRESET
  1324.         bne    HandleRESET
  1325.         tst.b    IntIsNMI
  1326.         bne    HandleNMI
  1327.         tst.w    IntIsIRQ
  1328.         bne    HandleIRQ
  1329.  
  1330. ; Kein Interrupt, Befehl ausführen
  1331. IntDont        Execute
  1332.  
  1333. ; IRQ: Interrupt-Bit testen, nach ($fffe) springen
  1334. HandleIRQ    move.l    CycleCounter,d0    ;IRQ muß seit zwei Zyklen anliegen
  1335.         sub.l    FirstIRQCycle,d0
  1336.         moveq    #2,d1
  1337.         cmp.l    d1,d0
  1338.         blo    IntDont
  1339.         tst.b    RINTERRUPT
  1340.         bne    IntDont
  1341.  
  1342.     IFNE    DEBUG_DETAIL
  1343.     tst.b    DEBUGON
  1344.     beq    1$
  1345.     DPRINTF    "CPU IRQ Sequence"
  1346. 1$
  1347.     ENDC
  1348.  
  1349. IRQ_1        ReadPC
  1350.         Next    IRQ_2
  1351. IRQ_2        ReadPC
  1352.         Next    IRQ_3
  1353. IRQ_3        move.w    RPC,d1
  1354.         lsr.w    #8,d1
  1355.         WriteStack
  1356.         DecS
  1357.         Next    IRQ_4
  1358. IRQ_4        move.b    RPC,d1
  1359.         WriteStack
  1360.         DecS
  1361.         Next    IRQ_5
  1362. IRQ_5        PushP    0        ;B auf 0
  1363.         Next    IRQ_6
  1364. IRQ_6        st    RINTERRUPT
  1365.         move.w    #$fffe,d0    ;IRQ-Vektor
  1366.         bsr    ReadByte
  1367.         move.b    d0,RPC
  1368.         lsl.w    #8,RPC
  1369.         Next    IRQ_7
  1370. IRQ_7        move.w    #$ffff,d0
  1371.         bsr    ReadByte
  1372.         move.b    d0,RPC
  1373.         ror.w    #8,RPC
  1374.         Last
  1375.  
  1376. ; NMI: Nach ($fffa) springen
  1377. HandleNMI    move.l    CycleCounter,d0    ;NMI muß seit zwei Zyklen anliegen
  1378.         sub.l    FirstNMICycle,d0
  1379.         moveq    #2,d1
  1380.         cmp.l    d1,d0
  1381.         blo    IntDont
  1382.  
  1383.         clr.b    IntIsNMI    ;Simuliert einen flankengetriggerten Eingang
  1384.  
  1385.     IFNE    DEBUG_DETAIL
  1386.     tst.b    DEBUGON
  1387.     beq    1$
  1388.     DPRINTF    "CPU NMI Sequence"
  1389. 1$
  1390.     ENDC
  1391.  
  1392. NMI_1        ReadPC
  1393.         Next    NMI_2
  1394. NMI_2        ReadPC
  1395.         Next    NMI_3
  1396. NMI_3        move.w    RPC,d1
  1397.         lsr.w    #8,d1
  1398.         WriteStack
  1399.         DecS
  1400.         Next    NMI_4
  1401. NMI_4        move.b    RPC,d1
  1402.         WriteStack
  1403.         DecS
  1404.         Next    NMI_5
  1405. NMI_5        PushP    0        ;B auf 0
  1406.         Next    NMI_6
  1407. NMI_6        st    RINTERRUPT
  1408.         move.w    #$fffa,d0    ;NMI-Vektor
  1409.         bsr    ReadByte
  1410.         move.b    d0,RPC
  1411.         lsl.w    #8,RPC
  1412.         Next    NMI_7
  1413. NMI_7        move.w    #$fffb,d0
  1414.         bsr    ReadByte
  1415.         move.b    d0,RPC
  1416.         ror.w    #8,RPC
  1417.         Last
  1418.  
  1419. ; RESET: Emulator beenden, anhalten oder nach ($fffc) springen
  1420. HandleRESET    tst.b    RESETIsEXIT    ;Beenden?
  1421.         bne    HandleEXIT
  1422.         tst.b    RESETIsPause    ;Pause?
  1423.         bne    HandlePause
  1424.  
  1425.         clr.l    Interrupt    ;Nein, RESET
  1426.         clr.b    NMIState
  1427.  
  1428.         move.l    TheRAM,a0    ;Adressierung ohne Vorzeichen!
  1429.         cmp.l    #$c3c2cd38,$4(a0) ; $4 ist $8004!
  1430.         bne    1$
  1431.         cmp.b    #$30,$8(a0)
  1432.         bne    1$
  1433.         clr.b    $4(a0)        ;CBM80 löschen, wenn vorhanden
  1434.  
  1435. 1$        clr.b    RDDR        ;Speicherkonfiguration einstellen
  1436.         clr.b    RPR
  1437.         NewConfig
  1438.  
  1439.         move.w    #$fffd,d0    ;RESET-Vektor
  1440.         bsr    ReadByte
  1441.         move.b    d0,RPC
  1442.         lsl.w    #8,RPC
  1443.         move.w    #$fffc,d0
  1444.         bsr    ReadByte
  1445.         move.b    d0,RPC
  1446.         bra    Fetch
  1447.  
  1448. ; EXIT: Signal an den Emulator schicken
  1449. HandleEXIT    jsr    _ExitDisplayFrom6510    ;Grafik aufräumen
  1450.  
  1451.         move.l    _SysBase,a6
  1452.         moveq    #0,d0
  1453.         move.b    ContinueSig,d0
  1454.         JSRLIB    FreeSignal
  1455.  
  1456.         JSRLIB    Forbid
  1457.         move.l    MainTask,a1
  1458.         move.l    ReadySet,d0
  1459.         JSRLIB    Signal
  1460.         move.l    InitialSP,a7
  1461.         moveq    #0,d0
  1462.         rts
  1463.  
  1464. ; Pause: Signal an den Emulator schicken und dann selbst auf
  1465. ;  ein Signal warten
  1466. HandlePause    bsr    Pause
  1467.         NewConfig
  1468.         bra    Fetch
  1469.  
  1470. Pause        clr.b    IntIsRESET
  1471.         clr.b    RESETIsPause
  1472.  
  1473.         move.b    RA,_RA        ;Register für SAM bereitstellen
  1474.         move.b    RX,_RX
  1475.         move.b    RY,_RY
  1476.  
  1477.         moveq    #0,d0
  1478.         btst    #3,RCCR+1    ;N dazunehmen
  1479.         beq    1$
  1480.         or.b    #$80,d0
  1481. 1$        tst.b    ROVERFLOW    ;V dazunehmen
  1482.         beq    2$
  1483.         or.b    #$40,d0
  1484. 2$        tst.b    RDECIMAL    ;D dazunehmen
  1485.         beq    3$
  1486.         or.b    #$08,d0
  1487. 3$        tst.b    RINTERRUPT    ;I dazunehmen
  1488.         beq    4$
  1489.         or.b    #$04,d0
  1490. 4$        btst    #2,RCCR+1    ;Z dazunehmen
  1491.         beq    5$
  1492.         or.b    #$02,d0
  1493. 5$        tst.b    RCARRY        ;C dazunehmen
  1494.         beq    6$
  1495.         or.b    #$01,d0
  1496. 6$        move.b    d0,_RP
  1497.  
  1498.         move.b    RDDR,_RDDR
  1499.         move.b    RPR,d0
  1500.         and.b    #$3f,d0
  1501.         move.b    d0,_RPR
  1502.  
  1503.         move.b    RDDR,d0
  1504.         not.b    d0
  1505.         or.b    RPR,d0
  1506.         and.b    #$07,d0
  1507.         move.b    d0,_SAMMemConfig
  1508.  
  1509.         move.w    RPC,_RPC
  1510.         move.w    RS,_RS
  1511.  
  1512.         move.l    a6,-(sp)
  1513.         move.l    _SysBase,a6
  1514.         move.l    MainTask,a1
  1515.         move.l    ReadySet,d0
  1516.         JSRLIB    Signal
  1517.         move.l    ContinueSet,d0
  1518.         JSRLIB    Wait
  1519.         move.l    (sp)+,a6
  1520.  
  1521.         move.b    _RA,RA        ;Register von SAM lesen
  1522.         move.b    _RX,RX
  1523.         move.b    _RY,RY
  1524.  
  1525.         clr.b    RCCR+1
  1526.         move.b    _RP,d0        ;N holen
  1527.         bpl    7$
  1528.         or.b    #$08,RCCR+1
  1529. 7$        add.b    d0,d0        ;V holen
  1530.         smi    ROVERFLOW
  1531.         lsl.b    #3,d0        ;D holen
  1532.         smi    RDECIMAL
  1533.         add.b    d0,d0        ;I holen
  1534.         smi    RINTERRUPT
  1535.         add.b    d0,d0        ;Z holen
  1536.         bpl    8$
  1537.         or.b    #$04,RCCR+1
  1538. 8$        add.b    d0,d0        ;C holen
  1539.         smi    RCARRY
  1540.  
  1541.         move.b    _RDDR,RDDR
  1542.         move.b    _RPR,RPR
  1543.         move.w    _RPC,RPC
  1544.         move.w    _RS,RS
  1545.         move.b    #$01,RS
  1546.         rts
  1547.  
  1548.  
  1549. **
  1550. ** Opcodes
  1551. **
  1552.  
  1553. *
  1554. * Load-Gruppe
  1555. *
  1556.  
  1557. LoadA        MACRO
  1558.         move.b    d0,RA
  1559.         move    ccr,RCCR
  1560.         Last
  1561.         ENDM
  1562.  
  1563. LDAImm_2    ReadByteImm
  1564.         LoadA
  1565.  
  1566. LDAZero_2    ReadByteZero    LDAZero
  1567.         LoadA
  1568.  
  1569. LDAZeroX_2    ReadByteZeroX    LDAZeroX
  1570.         LoadA
  1571.  
  1572. LDAAbs_2    ReadByteAbs    LDAAbs
  1573.         LoadA
  1574.  
  1575. LDAAbsX_2    ReadByteAbsX    LDAAbsX
  1576.         LoadA
  1577.  
  1578. LDAAbsY_2    ReadByteAbsY    LDAAbsY
  1579.         LoadA
  1580.  
  1581. LDAIndX_2    ReadByteIndX    LDAIndX
  1582.         LoadA
  1583.  
  1584. LDAIndY_2    ReadByteIndY    LDAIndY
  1585.         LoadA
  1586.  
  1587.  
  1588. LoadX        MACRO
  1589.         move.b    d0,RX
  1590.         move    ccr,RCCR
  1591.         Last
  1592.         ENDM
  1593.  
  1594. LDXImm_2    ReadByteImm
  1595.         LoadX
  1596.  
  1597. LDXZero_2    ReadByteZero    LDXZero
  1598.         LoadX
  1599.  
  1600. LDXZeroY_2    ReadByteZeroY    LDXZeroY
  1601.         LoadX
  1602.  
  1603. LDXAbs_2    ReadByteAbs    LDXAbs
  1604.         LoadX
  1605.  
  1606. LDXAbsY_2    ReadByteAbsY    LDXAbsY
  1607.         LoadX
  1608.  
  1609.  
  1610. LoadY        MACRO
  1611.         move.b    d0,RY
  1612.         move    ccr,RCCR
  1613.         Last
  1614.         ENDM
  1615.  
  1616. LDYImm_2    ReadByteImm
  1617.         LoadY
  1618.  
  1619. LDYZero_2    ReadByteZero    LDYZero
  1620.         LoadY
  1621.  
  1622. LDYZeroX_2    ReadByteZeroX    LDYZeroX
  1623.         LoadY
  1624.  
  1625. LDYAbs_2    ReadByteAbs    LDYAbs
  1626.         LoadY
  1627.  
  1628. LDYAbsX_2    ReadByteAbsX    LDYAbsX
  1629.         LoadY
  1630.  
  1631.  
  1632. LoadAX        MACRO
  1633.         move.b    d0,RA
  1634.         move.b    d0,RX
  1635.         move    ccr,RCCR
  1636.         Last
  1637.         ENDM
  1638.  
  1639. LAXZero_2    ReadByteZero    LAXZero
  1640.         LoadAX
  1641.  
  1642. LAXZeroY_2    ReadByteZeroY    LAXZeroY
  1643.         LoadAX
  1644.  
  1645. LAXAbs_2    ReadByteAbs    LAXAbs
  1646.         LoadAX
  1647.  
  1648. LAXAbsY_2    ReadByteAbsY    LAXAbsY
  1649.         LoadAX
  1650.  
  1651.  
  1652. *
  1653. * Store-Gruppe
  1654. *
  1655.  
  1656. StoreA        MACRO
  1657.         WriteADR RA
  1658.         Last
  1659.         ENDM
  1660.  
  1661. STAZero_2    ReadAdrZero    STAZero
  1662.         StoreA
  1663.  
  1664. STAZeroX_2    ReadAdrZeroX    STAZeroX
  1665.         StoreA
  1666.  
  1667. STAAbs_2    ReadAdrAbs    STAAbs
  1668.         StoreA
  1669.  
  1670. STAAbsX_2    ReadAdrAbsX    STAAbsX
  1671.         StoreA
  1672.  
  1673. STAAbsY_2    ReadAdrAbsY    STAAbsY
  1674.         StoreA
  1675.  
  1676. STAIndX_2    ReadAdrIndX    STAIndX
  1677.         StoreA
  1678.  
  1679. STAIndY_2    ReadAdrIndY    STAIndY
  1680.         StoreA
  1681.  
  1682.  
  1683. STXZero_2    ReadAdrZero    STXZero
  1684.         WriteADR RX
  1685.         Last
  1686.  
  1687. STXZeroY_2    ReadAdrZeroY    STXZeroY
  1688.         WriteADR RX
  1689.         Last
  1690.  
  1691. STXAbs_2    ReadAdrAbs    STXAbs
  1692.         WriteADR RX
  1693.         Last
  1694.  
  1695.  
  1696. STYZero_2    ReadAdrZero    STYZero
  1697.         WriteADR RY
  1698.         Last
  1699.  
  1700. STYZeroX_2    ReadAdrZeroX    STYZeroX
  1701.         WriteADR RY
  1702.         Last
  1703.  
  1704. STYAbs_2    ReadAdrAbs    STYAbs
  1705.         WriteADR RY
  1706.         Last
  1707.  
  1708.  
  1709. StoreAX        MACRO
  1710.         move.b    RA,d1
  1711.         move.w    RADR,d0
  1712.         and.b    RX,d1
  1713.         bsr    WriteByte
  1714.         Last
  1715.         ENDM
  1716.  
  1717. SAXZero_2    ReadAdrZero    SAXZero
  1718.         StoreAX
  1719.  
  1720. SAXZeroY_2    ReadAdrZeroY    SAXZeroY
  1721.         StoreAX
  1722.  
  1723. SAXAbs_2    ReadAdrAbs    SAXAbs
  1724.         StoreAX
  1725.  
  1726. SAXIndX_2    ReadAdrIndX    SAXIndX
  1727.         StoreAX
  1728.  
  1729.  
  1730. *
  1731. * Transfer-Gruppe
  1732. *
  1733.  
  1734. TAX_2        ReadPC
  1735.         move.b    RA,RX
  1736.         move    ccr,RCCR
  1737.         Last
  1738.  
  1739. TAY_2        ReadPC
  1740.         move.b    RA,RY
  1741.         move    ccr,RCCR
  1742.         Last
  1743.  
  1744. TXA_2        ReadPC
  1745.         move.b    RX,RA
  1746.         move    ccr,RCCR
  1747.         Last
  1748.  
  1749. TYA_2        ReadPC
  1750.         move.b    RY,RA
  1751.         move    ccr,RCCR
  1752.         Last
  1753.  
  1754. TXS_2        ReadPC
  1755.         move.b    RX,RS+1
  1756.         Last
  1757.  
  1758. TSX_2        ReadPC
  1759.         move.b    RS+1,RX
  1760.         move    ccr,RCCR
  1761.         Last
  1762.  
  1763.  
  1764. *
  1765. * Stack-Gruppe
  1766. *
  1767.  
  1768. PHA_2        ReadPC
  1769.         Next    PHA_3
  1770. PHA_3        WriteStack RA
  1771.         DecS
  1772.         Last
  1773.  
  1774. PLA_2        ReadPC
  1775.         Next    PLA_3
  1776. PLA_3        ReadStack
  1777.         IncS
  1778.         Next    PLA_4
  1779. PLA_4        ReadStack
  1780.         move.b    d0,RA
  1781.         move    ccr,RCCR
  1782.         Last
  1783.  
  1784. PHP_2        ReadPC
  1785.         Next    PHP_3
  1786. PHP_3        PushP    1        ;B immer 1
  1787.         Last
  1788.  
  1789. PLP_2        ReadPC
  1790.         Next    PLP_3
  1791. PLP_3        ReadStack
  1792.         IncS
  1793.         Next    PLP_4
  1794. PLP_4        PopP
  1795.         Last
  1796.  
  1797.  
  1798. *
  1799. * Vergleichs-Gruppe
  1800. *
  1801.  
  1802. CompareA    MACRO
  1803.         move.b    RA,d1
  1804.         cmp.b    d0,d1
  1805.         move    ccr,RCCR
  1806.         scc    RCARRY        ;Inverses Carry holen
  1807.         Last
  1808.         ENDM
  1809.  
  1810. CMPImm_2    ReadByteImm
  1811.         CompareA
  1812.  
  1813. CMPZero_2    ReadByteZero    CMPZero
  1814.         CompareA
  1815.  
  1816. CMPZeroX_2    ReadByteZeroX    CMPZeroX
  1817.         CompareA
  1818.  
  1819. CMPAbs_2    ReadByteAbs    CMPAbs
  1820.         CompareA
  1821.  
  1822. CMPAbsX_2    ReadByteAbsX    CMPAbsX
  1823.         CompareA
  1824.  
  1825. CMPAbsY_2    ReadByteAbsY    CMPAbsY
  1826.         CompareA
  1827.  
  1828. CMPIndX_2    ReadByteIndX    CMPIndX
  1829.         CompareA
  1830.  
  1831. CMPIndY_2    ReadByteIndY    CMPIndY
  1832.         CompareA
  1833.  
  1834.  
  1835. CompareX    MACRO
  1836.         move.b    RX,d1
  1837.         cmp.b    d0,d1
  1838.         move    ccr,RCCR
  1839.         scc    RCARRY        ;Inverses Carry holen
  1840.         Last
  1841.         ENDM
  1842.  
  1843. CPXImm_2    ReadByteImm
  1844.         CompareX
  1845.  
  1846. CPXZero_2    ReadByteZero    CPXZero
  1847.         CompareX
  1848.  
  1849. CPXAbs_2    ReadByteAbs    CPXAbs
  1850.         CompareX
  1851.  
  1852.  
  1853. CompareY    MACRO
  1854.         move.b    RY,d1
  1855.         cmp.b    d0,d1
  1856.         move    ccr,RCCR
  1857.         scc    RCARRY        ;Inverses Carry holen
  1858.         Last
  1859.         ENDM
  1860.  
  1861. CPYImm_2    ReadByteImm
  1862.         CompareY
  1863.  
  1864. CPYZero_2    ReadByteZero    CPYZero
  1865.         CompareY
  1866.  
  1867. CPYAbs_2    ReadByteAbs    CPYAbs
  1868.         CompareY
  1869.  
  1870.  
  1871. *
  1872. * Logik-Gruppe
  1873. *
  1874.  
  1875. AndA        MACRO
  1876.         and.b    d0,RA
  1877.         move    ccr,RCCR
  1878.         Last
  1879.         ENDM
  1880.  
  1881. ANDImm_2    ReadByteImm
  1882.         AndA
  1883.  
  1884. ANDZero_2    ReadByteZero    ANDZero
  1885.         AndA
  1886.  
  1887. ANDZeroX_2    ReadByteZeroX    ANDZeroX
  1888.         AndA
  1889.  
  1890. ANDAbs_2    ReadByteAbs    ANDAbs
  1891.         AndA
  1892.  
  1893. ANDAbsX_2    ReadByteAbsX    ANDAbsX
  1894.         AndA
  1895.  
  1896. ANDAbsY_2    ReadByteAbsY    ANDAbsY
  1897.         AndA
  1898.  
  1899. ANDIndX_2    ReadByteIndX    ANDIndX
  1900.         AndA
  1901.  
  1902. ANDIndY_2    ReadByteIndY    ANDIndY
  1903.         AndA
  1904.  
  1905.  
  1906. OrA        MACRO
  1907.         or.b    d0,RA
  1908.         move    ccr,RCCR
  1909.         Last
  1910.         ENDM
  1911.  
  1912. ORAImm_2    ReadByteImm
  1913.         OrA
  1914.  
  1915. ORAZero_2    ReadByteZero    ORAZero
  1916.         OrA
  1917.  
  1918. ORAZeroX_2    ReadByteZeroX    ORAZeroX
  1919.         OrA
  1920.  
  1921. ORAAbs_2    ReadByteAbs    ORAAbs
  1922.         OrA
  1923.  
  1924. ORAAbsX_2    ReadByteAbsX    ORAAbsX
  1925.         OrA
  1926.  
  1927. ORAAbsY_2    ReadByteAbsY    ORAAbsY
  1928.         OrA
  1929.  
  1930. ORAIndX_2    ReadByteIndX    ORAIndX
  1931.         OrA
  1932.  
  1933. ORAIndY_2    ReadByteIndY    ORAIndY
  1934.         OrA
  1935.  
  1936.  
  1937. EorA        MACRO
  1938.         eor.b    d0,RA
  1939.         move    ccr,RCCR
  1940.         Last
  1941.         ENDM
  1942.  
  1943. EORImm_2    ReadByteImm
  1944.         EorA
  1945.  
  1946. EORZero_2    ReadByteZero    EORZero
  1947.         EorA
  1948.  
  1949. EORZeroX_2    ReadByteZeroX    EORZeroX
  1950.         EorA
  1951.  
  1952. EORAbs_2    ReadByteAbs    EORAbs
  1953.         EorA
  1954.  
  1955. EORAbsX_2    ReadByteAbsX    EORAbsX
  1956.         EorA
  1957.  
  1958. EORAbsY_2    ReadByteAbsY    EORAbsY
  1959.         EorA
  1960.  
  1961. EORIndX_2    ReadByteIndX    EORIndX
  1962.         EorA
  1963.  
  1964. EORIndY_2    ReadByteIndY    EORIndY
  1965.         EorA
  1966.  
  1967.  
  1968. BitTest        MACRO
  1969.         tst.b    d0        ;N holen
  1970.         move    ccr,RCCR
  1971.         btst    #6,d0        ;Bit 6 -> V
  1972.         sne    ROVERFLOW
  1973.         and.b    RA,d0        ;A AND M -> Z
  1974.         beq    BitZ\@
  1975.         and.b    #$fb,RCCR+1
  1976.         Last
  1977. BitZ\@        or.b    #$04,RCCR+1
  1978.         Last
  1979.         ENDM
  1980.  
  1981. BITZero_2    ReadByteZero    BITZero
  1982.         BitTest
  1983.  
  1984. BITAbs_2    ReadByteAbs    BITAbs
  1985.         BitTest
  1986.  
  1987.  
  1988. *
  1989. * Arithmetik-Gruppe
  1990. *
  1991.  
  1992. AdcA        MACRO
  1993.         move.b    RCARRY,d1
  1994.         tst.b    RDECIMAL
  1995.         bne    \@1$
  1996.  
  1997.         add.b    d1,d1        ;Carry -> X
  1998.         move.b    RA,d1
  1999.         addx.b    d0,d1
  2000.         scs    RCARRY        ;Carry holen
  2001.         svs    ROVERFLOW    ;Overflow holen
  2002.         move.b    d1,RA
  2003.         move    ccr,RCCR    ;N und Z holen
  2004.         Last
  2005.  
  2006. \@1$        bsr    AdcDec
  2007.         Last
  2008.         ENDM
  2009.  
  2010. AdcDec        move.b    d0,TMPS        ;Dezimalmodus
  2011.         move.b    RA,d2
  2012.         move.b    d2,TMPA
  2013.  
  2014.         clr.w    RCCR
  2015.         clr.b    ROVERFLOW
  2016.  
  2017.         move.b    d2,d3        ;Unteres Nybble berechnen
  2018.         and.b    #$0f,d0
  2019.         and.b    #$0f,d3
  2020.         add.b    d1,d1        ;Carry -> X
  2021.         addx.b    d0,d3        ; -> d3
  2022.  
  2023.         cmp.b    #10,d3        ;BCD-Fixup für das untere Nybble
  2024.         blo    2$
  2025.         addq.b    #6,d3
  2026. 2$
  2027.         move.b    TMPS,d0        ;Oberes Nybble berechnen
  2028.         lsr.b    #4,d0
  2029.         lsr.b    #4,d2
  2030.         add.b    d0,d2
  2031.         cmp.b    #$10,d3
  2032.         blo    1$
  2033.         addq.b    #1,d2        ; -> d2
  2034. 1$
  2035.         move.b    TMPS,d0        ;Z holen (wie im Binärmodus)
  2036.         move.b    TMPA,d4
  2037.         add.b    d1,d1        ;Carry -> X
  2038.         addx.b    d0,d4
  2039.         tst.b    d4        ;Wegen addx
  2040.         bne    6$
  2041.         or.w    #$04,RCCR
  2042. 6$
  2043.         btst    #3,d2        ;N berechnen
  2044.         beq    4$
  2045.         or.w    #$08,RCCR
  2046. 4$
  2047.         move.b    d2,d0        ;V berechnen
  2048.         lsl.b    #4,d0
  2049.         move.b    TMPA,d1
  2050.         eor.b    d1,d0
  2051.         bpl    5$
  2052.         move.b    TMPS,d0
  2053.         eor.b    d1,d0
  2054.         spl    ROVERFLOW
  2055. 5$
  2056.         cmp.b    #10,d2        ;BCD-Fixup für das obere Nybble
  2057.         blo    3$
  2058.         addq.b    #6,d2
  2059. 3$
  2060.         cmp.b    #$10,d2        ;Carry holen
  2061.         shs    RCARRY
  2062.  
  2063.         and.b    #$0f,d3        ;Ergebnis zusammensetzen
  2064.         lsl.b    #4,d2
  2065.         or.b    d3,d2
  2066.         move.b    d2,RA
  2067.         rts
  2068.  
  2069. ADCImm_2    ReadByteImm
  2070.         AdcA
  2071.  
  2072. ADCZero_2    ReadByteZero    ADCZero
  2073.         AdcA
  2074.  
  2075. ADCZeroX_2    ReadByteZeroX    ADCZeroX
  2076.         AdcA
  2077.  
  2078. ADCAbs_2    ReadByteAbs    ADCAbs
  2079.         AdcA
  2080.  
  2081. ADCAbsX_2    ReadByteAbsX    ADCAbsX
  2082.         AdcA
  2083.  
  2084. ADCAbsY_2    ReadByteAbsY    ADCAbsY
  2085.         AdcA
  2086.  
  2087. ADCIndX_2    ReadByteIndX    ADCIndX
  2088.         AdcA
  2089.  
  2090. ADCIndY_2    ReadByteIndY    ADCIndY
  2091.         AdcA
  2092.  
  2093.  
  2094. SbcA        MACRO
  2095.         move.b    RCARRY,d1
  2096.         not.b    d1
  2097.         tst.b    RDECIMAL
  2098.         bne    \@1$
  2099.  
  2100.         add.b    d1,d1        ;Inverses Carry -> X
  2101.         move.b    RA,d1
  2102.         subx.b    d0,d1
  2103.         scc    RCARRY        ;Inverses Carry holen
  2104.         svs    ROVERFLOW    ;Overflow holen
  2105.         move.b    d1,RA
  2106.         move    ccr,RCCR
  2107.         Last
  2108.  
  2109. \@1$        bsr    SbcDec
  2110.         Last
  2111.         ENDM
  2112.  
  2113. SbcDec        move.b    d0,TMPS        ;Dezimalmodus
  2114.         move.b    RA,d2
  2115.         move.b    d2,TMPA
  2116.  
  2117.         and.b    #$0f,d0        ;Unteres Nybble berechnen
  2118.         and.b    #$0f,d2
  2119.         add.b    d1,d1        ;Inverses Carry -> X
  2120.         subx.b    d0,d2
  2121.         move    ccr,d4
  2122.         bcc    1$        ;BCD-Fixup
  2123.         subq.b    #6,d2
  2124.         st    d4
  2125. 1$        and.b    #$0f,d2
  2126.         move.b    d2,d3        ;-> d3
  2127.  
  2128.         move.b    TMPS,d0        ;Oberes Nybble berechnen
  2129.         move.b    TMPA,d2
  2130.         and.b    #$f0,d0
  2131.         and.b    #$f0,d2
  2132.         sub.b    d0,d2
  2133.         bcc    2$        ;BCD-Fixup
  2134.         and.b    #$f0,d2
  2135.         sub.b    #$60,d2
  2136.         btst    #0,d4
  2137.         beq    4$
  2138.         sub.b    #$10,d2
  2139.         bra    4$
  2140. 2$        and.b    #$f0,d2
  2141.         btst    #0,d4
  2142.         beq    4$
  2143.         sub.b    #$10,d2
  2144.         bcc    4$
  2145.         sub.b    #$60,d2
  2146. 4$        or.b    d3,d2        ;Ergebnis zusammenbauen
  2147.         move.b    d2,RA
  2148.  
  2149.         add.b    d1,d1        ;Inverses Carry -> X
  2150.         move.b    TMPS,d0        ;Flags berechnen (wie im Binärmodus)
  2151.         move.b    TMPA,d1
  2152.         subx.b    d0,d1        ;Flags berechnen
  2153.         scc    RCARRY        ;Inverses Carry holen
  2154.         svs    ROVERFLOW    ;Overflow holen
  2155.         tst.b    d1
  2156.         move    ccr,RCCR    ;N und Z holen
  2157.         rts
  2158.  
  2159. SBCImm_2    ReadByteImm
  2160.         SbcA
  2161.  
  2162. SBCZero_2    ReadByteZero    SBCZero
  2163.         SbcA
  2164.  
  2165. SBCZeroX_2    ReadByteZeroX    SBCZeroX
  2166.         SbcA
  2167.  
  2168. SBCAbs_2    ReadByteAbs    SBCAbs
  2169.         SbcA
  2170.  
  2171. SBCAbsX_2    ReadByteAbsX    SBCAbsX
  2172.         SbcA
  2173.  
  2174. SBCAbsY_2    ReadByteAbsY    SBCAbsY
  2175.         SbcA
  2176.  
  2177. SBCIndX_2    ReadByteIndX    SBCIndX
  2178.         SbcA
  2179.  
  2180. SBCIndY_2    ReadByteIndY    SBCIndY
  2181.         SbcA
  2182.  
  2183.  
  2184. *
  2185. * Inkrement/Dekrement-Gruppe
  2186. *
  2187.  
  2188. Increment    MACRO
  2189.         move.b    RDBUF,d1
  2190.         move.w    RADR,d0
  2191.         addq.b    #1,d1
  2192.         move    ccr,RCCR
  2193.         bsr    WriteByte
  2194.         Last
  2195.         ENDM
  2196.  
  2197. INCZero_2    ReadRMWZero    INCZero
  2198.         Increment
  2199.  
  2200. INCZeroX_2    ReadRMWZeroX    INCZeroX
  2201.         Increment
  2202.  
  2203. INCAbs_2    ReadRMWAbs    INCAbs
  2204.         Increment
  2205.  
  2206. INCAbsX_2    ReadRMWAbsX    INCAbsX
  2207.         Increment
  2208.  
  2209.  
  2210. Decrement    MACRO
  2211.         move.b    RDBUF,d1
  2212.         move.w    RADR,d0
  2213.         subq.b    #1,d1
  2214.         move    ccr,RCCR
  2215.         bsr    WriteByte
  2216.         Last
  2217.         ENDM
  2218.  
  2219. DECZero_2    ReadRMWZero    DECZero
  2220.         Decrement
  2221.  
  2222. DECZeroX_2    ReadRMWZeroX    DECZeroX
  2223.         Decrement
  2224.  
  2225. DECAbs_2    ReadRMWAbs    DECAbs
  2226.         Decrement
  2227.  
  2228. DECAbsX_2    ReadRMWAbsX    DECAbsX
  2229.         Decrement
  2230.  
  2231.  
  2232. INX_2        ReadPC
  2233.         addq.b    #1,RX
  2234.         move    ccr,RCCR
  2235.         Last
  2236.  
  2237. INY_2        ReadPC
  2238.         addq.b    #1,RY
  2239.         move    ccr,RCCR
  2240.         Last
  2241.  
  2242. DEX_2        ReadPC
  2243.         subq.b    #1,RX
  2244.         move    ccr,RCCR
  2245.         Last
  2246.  
  2247. DEY_2        ReadPC
  2248.         subq.b    #1,RY
  2249.         move    ccr,RCCR
  2250.         Last
  2251.  
  2252.  
  2253. *
  2254. * Schiebe-/Rotations-Gruppe
  2255. *
  2256.  
  2257. ShiftLeft    MACRO
  2258.         move.b    RDBUF,d1
  2259.         move.w    RADR,d0
  2260.         add.b    d1,d1
  2261.         move    ccr,RCCR
  2262.         scs    RCARRY        ;Carry holen
  2263.         bsr    WriteByte
  2264.         Last
  2265.         ENDM
  2266.  
  2267. ASLA_2        ReadPC
  2268.         move.b    RA,d0
  2269.         add.b    d0,d0
  2270.         move    ccr,RCCR
  2271.         scs    RCARRY        ;Carry holen
  2272.         move.b    d0,RA
  2273.         Last
  2274.  
  2275. ASLZero_2    ReadRMWZero    ASLZero
  2276.         ShiftLeft
  2277.  
  2278. ASLZeroX_2    ReadRMWZeroX    ASLZeroX
  2279.         ShiftLeft
  2280.  
  2281. ASLAbs_2    ReadRMWAbs    ASLAbs
  2282.         ShiftLeft
  2283.  
  2284. ASLAbsX_2    ReadRMWAbsX    ASLAbsX
  2285.         ShiftLeft
  2286.  
  2287.  
  2288. ShiftRight    MACRO
  2289.         move.b    RDBUF,d1
  2290.         move.w    RADR,d0
  2291.         lsr.b    #1,d1
  2292.         move    ccr,RCCR
  2293.         scs    RCARRY        ;Carry holen
  2294.         bsr    WriteByte
  2295.         Last
  2296.         ENDM
  2297.  
  2298. LSRA_2        ReadPC
  2299.         move.b    RA,d0
  2300.         lsr.b    #1,d0
  2301.         move    ccr,RCCR
  2302.         scs    RCARRY        ;Carry holen
  2303.         move.b    d0,RA
  2304.         Last
  2305.  
  2306. LSRZero_2    ReadRMWZero    LSRZero
  2307.         ShiftRight
  2308.  
  2309. LSRZeroX_2    ReadRMWZeroX    LSRZeroX
  2310.         ShiftRight
  2311.  
  2312. LSRAbs_2    ReadRMWAbs    LSRAbs
  2313.         ShiftRight
  2314.  
  2315. LSRAbsX_2    ReadRMWAbsX    LSRAbsX
  2316.         ShiftRight
  2317.  
  2318.  
  2319. RotateLeft    MACRO
  2320.         move.b    RCARRY,d2
  2321.         move.b    RDBUF,d1
  2322.         move.w    RADR,d0
  2323.         add.b    d2,d2        ;Carry -> X
  2324.         roxl.b    #1,d1        ;Vorsicht bei addx und dem Z-Flag!
  2325.         move    ccr,RCCR
  2326.         scs    RCARRY        ;Carry holen
  2327.         bsr    WriteByte
  2328.         Last
  2329.         ENDM
  2330.  
  2331. ROLA_2        ReadPC
  2332.         move.b    RCARRY,d2
  2333.         move.b    RA,d1
  2334.         add.b    d2,d2        ;Carry -> X
  2335.         roxl.b    #1,d1        ;Vorsicht bei addx und dem Z-Flag!
  2336.         move    ccr,RCCR
  2337.         scs    RCARRY        ;Carry holen
  2338.         move.b    d1,RA
  2339.         Last
  2340.  
  2341. ROLZero_2    ReadRMWZero    ROLZero
  2342.         RotateLeft
  2343.  
  2344. ROLZeroX_2    ReadRMWZeroX    ROLZeroX
  2345.         RotateLeft
  2346.  
  2347. ROLAbs_2    ReadRMWAbs    ROLAbs
  2348.         RotateLeft
  2349.  
  2350. ROLAbsX_2    ReadRMWAbsX    ROLAbsX
  2351.         RotateLeft
  2352.  
  2353.  
  2354. RotateRight    MACRO
  2355.         move.b    RCARRY,d2
  2356.         move.b    RDBUF,d1
  2357.         move.w    RADR,d0
  2358.         add.b    d2,d2        ;Carry -> X
  2359.         roxr.b    #1,d1
  2360.         move    ccr,RCCR
  2361.         scs    RCARRY        ;Carry holen
  2362.         bsr    WriteByte
  2363.         Last
  2364.         ENDM
  2365.  
  2366. RORA_2        ReadPC
  2367.         move.b    RCARRY,d2
  2368.         move.b    RA,d1
  2369.         add.b    d2,d2        ;Carry -> X
  2370.         roxr.b    #1,d1
  2371.         move    ccr,RCCR
  2372.         scs    RCARRY        ;Carry holen
  2373.         move.b    d1,RA
  2374.         Last
  2375.  
  2376. RORZero_2    ReadRMWZero    RORZero
  2377.         RotateRight
  2378.  
  2379. RORZeroX_2    ReadRMWZeroX    RORZeroX
  2380.         RotateRight
  2381.  
  2382. RORAbs_2    ReadRMWAbs    RORAbs
  2383.         RotateRight
  2384.  
  2385. RORAbsX_2    ReadRMWAbsX    RORAbsX
  2386.         RotateRight
  2387.  
  2388.  
  2389. *
  2390. * Sprungbefehle
  2391. *
  2392.  
  2393. JMPAbs_2    ReadPCInc RADRL
  2394.         Next    JMPAbs_3
  2395. JMPAbs_3    ReadPC    RPC
  2396.         lsl.w    #8,RPC
  2397.         move.b    RADRL,RPC
  2398.         Last
  2399.  
  2400. JMPInd_2    ReadByteAbs    JMPInd,RPC
  2401.         addq.b    #1,RADRL    ;Keine Seitenüberschreitung
  2402.         lsl.w    #8,RPC
  2403.         Next    JMPInd_5
  2404. JMPInd_5    ReadADR RPC
  2405.         ror.w    #8,RPC
  2406.         Last
  2407.  
  2408.  
  2409. JSR_2        ReadPCInc RADRL
  2410.         Next    JSR_3
  2411. JSR_3        ReadStack
  2412.         Next    JSR_4
  2413. JSR_4        move.w    RPC,d1
  2414.         lsr.w    #8,d1
  2415.         WriteStack
  2416.         DecS
  2417.         Next    JSR_5
  2418. JSR_5        move.b    RPC,d1
  2419.         WriteStack
  2420.         DecS
  2421.         Next    JSR_6
  2422. JSR_6        ReadPC    RPC
  2423.         lsl.w    #8,RPC
  2424.         move.b    RADRL,RPC
  2425.         Last
  2426.  
  2427. RTS_2        ReadPC
  2428.         Next    RTS_3
  2429. RTS_3        ReadStack
  2430.         IncS
  2431.         Next    RTS_4
  2432. RTS_4        ReadStack RADRL
  2433.         IncS
  2434.         Next    RTS_5
  2435. RTS_5        ReadStack RPC
  2436.         lsl.w    #8,RPC
  2437.         move.b    RADRL,RPC
  2438.         Next    RTS_6
  2439. RTS_6        ReadPCInc
  2440.         Last
  2441.  
  2442.  
  2443. BRK_2        ReadPC
  2444.         Next    BRK_3
  2445. BRK_3        move.w    RPC,d1
  2446.         lsr.w    #8,d1
  2447.         WriteStack
  2448.         DecS
  2449.         Next    BRK_4
  2450. BRK_4        move.b    RPC,d1
  2451.         WriteStack
  2452.         DecS
  2453.         Next    BRK_5
  2454. BRK_5        PushP    1        ;B auf 1
  2455.         Next    BRK_6
  2456. BRK_6        st    RINTERRUPT
  2457.         move.w    #$fffe,d0    ;IRQ-Vektor
  2458.         bsr    ReadByte
  2459.         move.b    d0,RPC
  2460.         lsl.w    #8,RPC
  2461.         Next    BRK_7
  2462. BRK_7        move.w    #$ffff,d0
  2463.         bsr    ReadByte
  2464.         move.b    d0,RPC
  2465.         ror.w    #8,RPC
  2466.         Last
  2467.  
  2468.  
  2469. RTI_2        ReadPC
  2470.         Next    RTI_3
  2471. RTI_3        ReadStack
  2472.         IncS
  2473.         Next    RTI_4
  2474. RTI_4        PopP
  2475.         IncS
  2476.         Next    RTI_5
  2477. RTI_5        ReadStack RADRL
  2478.         IncS
  2479.         Next    RTI_6
  2480. RTI_6        ReadStack RPC
  2481.         lsl.w    #8,RPC
  2482.         move.b    RADRL,RPC
  2483.         Last
  2484.  
  2485.  
  2486. *
  2487. * Verzweigungsbefehle
  2488. *
  2489.  
  2490. BranchB        MACRO    ;Name des Opcodes, zu testendes Bit, 0/1
  2491.             ;Also: Verzweige, wenn Bit \2 in RCCR gleich \4 ist
  2492.         ReadByteImm RADRL
  2493.         btst    #\2,RCCR+1    ;Verzweigung genommen?
  2494.     IFEQ    \3
  2495.         beq    \1Yes
  2496.     ELSE
  2497.         bne    \1Yes
  2498.     ENDC
  2499.         Last            ;Nein, nächster Opcode
  2500. \1Yes        Next    \1_3
  2501. \1_3        ReadPC
  2502.         move.b    RADRL,d0    ;Ja, PC erhöhen
  2503.         bpl    \1Forward
  2504.         neg.b    d0        ;Sprung zurück, Seitenüberschreitung?
  2505.         sub.b    d0,RPC
  2506.         bcs    \1BPage
  2507.         Last            ;Nein, nächster Opcode
  2508. \1BPage        Next    \1_4b
  2509. \1_4b        ReadPC            ;Ja, PC korrigieren
  2510.         sub.w    #$100,RPC
  2511.         Last
  2512. \1Forward    add.b    d0,RPC        ;Sprung nach vorne, Seitenüberschreitung?
  2513.         bcs    \1FPage
  2514.         Last            ;Nein, nächster Opcode
  2515. \1FPage        Next    \1_4f
  2516. \1_4f        ReadPC
  2517.         add.w    #$100,RPC    ;Ja, PC korrigieren
  2518.         Last
  2519.         ENDM
  2520.  
  2521. BranchF        MACRO    ;Name des Opcodes, Flag, 0/1
  2522.             ;Also: Verzweige, wenn \2 gleich \3 ist
  2523.         ReadByteImm RADRL
  2524.         tst.b    \2        ;Verzweigung genommen?
  2525.     IFEQ    \3
  2526.         beq    \1Yes
  2527.     ELSE
  2528.         bne    \1Yes
  2529.     ENDC
  2530.         Last            ;Nein, nächster Opcode
  2531. \1Yes        Next    \1_3
  2532. \1_3        ReadPC
  2533.         move.b    RADRL,d0    ;Ja, PC erhöhen
  2534.         bpl    \1Forward
  2535.         neg.b    d0        ;Sprung zurück, Seitenüberschreitung?
  2536.         sub.b    d0,RPC
  2537.         bcs    \1BPage
  2538.         Last            ;Nein, nächster Opcode
  2539. \1BPage        Next    \1_4b
  2540. \1_4b        ReadPC            ;Ja, PC korrigieren
  2541.         sub.w    #$100,RPC
  2542.         Last
  2543. \1Forward    add.b    d0,RPC        ;Sprung nach vorne, Seitenüberschreitung?
  2544.         bcs    \1FPage
  2545.         Last            ;Nein, nächster Opcode
  2546. \1FPage        Next    \1_4f
  2547. \1_4f        ReadPC
  2548.         add.w    #$100,RPC    ;Ja, PC korrigieren
  2549.         Last
  2550.         ENDM
  2551.  
  2552. BVC_2        BranchF    BVC,ROVERFLOW,0
  2553.  
  2554. BVS_2        BranchF    BVS,ROVERFLOW,1
  2555.  
  2556. BEQ_2        BranchB    BEQ,2,1
  2557.  
  2558. BNE_2        BranchB    BNE,2,0
  2559.  
  2560. BPL_2        BranchB    BPL,3,0
  2561.  
  2562. BMI_2        BranchB    BMI,3,1
  2563.  
  2564. BCC_2        BranchF    BCC,RCARRY,0
  2565.  
  2566. BCS_2        BranchF    BCS,RCARRY,1
  2567.  
  2568.  
  2569. *
  2570. * Flag-Gruppe
  2571. *
  2572.  
  2573. CLI_2        ReadPC
  2574.         clr.b    RINTERRUPT
  2575.         Last
  2576.  
  2577. SEI_2        ReadPC
  2578.         st    RINTERRUPT
  2579.         Last
  2580.  
  2581. CLC_2        ReadPC
  2582.         clr.b    RCARRY
  2583.         Last
  2584.  
  2585. SEC_2        ReadPC
  2586.         st    RCARRY
  2587.         Last
  2588.  
  2589. CLD_2        ReadPC
  2590.         clr.b    RDECIMAL
  2591.         Last
  2592.  
  2593. SED_2        ReadPC
  2594.         st    RDECIMAL
  2595.         Last
  2596.  
  2597. CLV_2        ReadPC
  2598.         clr.b    ROVERFLOW
  2599.         Last
  2600.  
  2601.  
  2602. *
  2603. * NOPs
  2604. *
  2605.  
  2606. NOPImpl_2    ReadPC
  2607.         Last
  2608.  
  2609. NOPImm_2    ReadByteImm
  2610.         Last
  2611.  
  2612. NOPZero_2    ReadByteZero    NOPZero
  2613.         Last
  2614.  
  2615. NOPZeroX_2    ReadByteZeroX    NOPZeroX
  2616.         Last
  2617.  
  2618. NOPAbs_2    ReadByteAbs    NOPAbs
  2619.         Last
  2620.  
  2621. NOPAbsX_2    ReadByteAbsX    NOPAbsX
  2622.         Last
  2623.  
  2624.  
  2625. *
  2626. * ASL/ORA-Gruppe (SLO)
  2627. *
  2628.  
  2629. ShiftLeftOr    MACRO
  2630.         move.b    RDBUF,d1
  2631.         move.w    RADR,d0
  2632.         add.b    d1,d1
  2633.         scs    RCARRY        ;Carry holen
  2634.         or.b    d1,RA
  2635.         move    ccr,RCCR
  2636.         bsr    WriteByte
  2637.         Last
  2638.         ENDM
  2639.  
  2640. SLOZero_2    ReadRMWZero    SLOZero
  2641.         ShiftLeftOr
  2642.  
  2643. SLOZeroX_2    ReadRMWZeroX    SLOZeroX
  2644.         ShiftLeftOr
  2645.  
  2646. SLOAbs_2    ReadRMWAbs    SLOAbs
  2647.         ShiftLeftOr
  2648.  
  2649. SLOAbsX_2    ReadRMWAbsX    SLOAbsX
  2650.         ShiftLeftOr
  2651.  
  2652. SLOAbsY_2    ReadRMWAbsY    SLOAbsY
  2653.         ShiftLeftOr
  2654.  
  2655. SLOIndX_2    ReadRMWIndX    SLOIndX
  2656.         ShiftLeftOr
  2657.  
  2658. SLOIndY_2    ReadRMWIndY    SLOIndY
  2659.         ShiftLeftOr
  2660.  
  2661.  
  2662. *
  2663. * ROL/AND-Gruppe (RLA)
  2664. *
  2665.  
  2666. RotateLeftAnd    MACRO
  2667.         move.b    RCARRY,d2
  2668.         move.b    RDBUF,d1
  2669.         move.w    RADR,d0
  2670.         add.b    d2,d2        ;Carry -> X
  2671.         roxl.b    #1,d1
  2672.         scs    RCARRY        ;Carry holen
  2673.         and.b    d1,RA
  2674.         move    ccr,RCCR
  2675.         bsr    WriteByte
  2676.         Last
  2677.         ENDM
  2678.  
  2679. RLAZero_2    ReadRMWZero    RLAZero
  2680.         RotateLeftAnd
  2681.  
  2682. RLAZeroX_2    ReadRMWZeroX    RLAZeroX
  2683.         RotateLeftAnd
  2684.  
  2685. RLAAbs_2    ReadRMWAbs    RLAAbs
  2686.         RotateLeftAnd
  2687.  
  2688. RLAAbsX_2    ReadRMWAbsX    RLAAbsX
  2689.         RotateLeftAnd
  2690.  
  2691. RLAAbsY_2    ReadRMWAbsY    RLAAbsY
  2692.         RotateLeftAnd
  2693.  
  2694. RLAIndX_2    ReadRMWIndX    RLAIndX
  2695.         RotateLeftAnd
  2696.  
  2697. RLAIndY_2    ReadRMWIndY    RLAIndY
  2698.         RotateLeftAnd
  2699.  
  2700.  
  2701. *
  2702. * LSR/EOR-Gruppe (SRE)
  2703. *
  2704.  
  2705. ShiftRightEor    MACRO
  2706.         move.b    RDBUF,d1
  2707.         move.w    RADR,d0
  2708.         lsr.b    #1,d1
  2709.         scs    RCARRY        ;Carry holen
  2710.         eor.b    d1,RA
  2711.         move    ccr,RCCR
  2712.         bsr    WriteByte
  2713.         Last
  2714.         ENDM
  2715.  
  2716. SREZero_2    ReadRMWZero    SREZero
  2717.         ShiftRightEor
  2718.  
  2719. SREZeroX_2    ReadRMWZeroX    SREZeroX
  2720.         ShiftRightEor
  2721.  
  2722. SREAbs_2    ReadRMWAbs    SREAbs
  2723.         ShiftRightEor
  2724.  
  2725. SREAbsX_2    ReadRMWAbsX    SREAbsX
  2726.         ShiftRightEor
  2727.  
  2728. SREAbsY_2    ReadRMWAbsY    SREAbsY
  2729.         ShiftRightEor
  2730.  
  2731. SREIndX_2    ReadRMWIndX    SREIndX
  2732.         ShiftRightEor
  2733.  
  2734. SREIndY_2    ReadRMWIndY    SREIndY
  2735.         ShiftRightEor
  2736.  
  2737.  
  2738. *
  2739. * ROR/ADC-Gruppe (RRA)
  2740. *
  2741.  
  2742. RotateRightAdc    MACRO
  2743.         move.b    RCARRY,d2
  2744.         move.b    RDBUF,d1
  2745.         move.w    RADR,d0
  2746.         add.b    d2,d2        ;Carry -> X
  2747.         roxr.b    #1,d1
  2748.         scs    RCARRY        ;Carry holen
  2749.         move.b    RA,d2
  2750.         addx.b    d1,d2
  2751.         svs    ROVERFLOW    ;Overflow holen
  2752.         move.b    d2,RA
  2753.         move    ccr,RCCR
  2754.         bsr    WriteByte
  2755.         Last
  2756.         ENDM
  2757.  
  2758. RRAZero_2    ReadRMWZero    RRAZero
  2759.         RotateRightAdc
  2760.  
  2761. RRAZeroX_2    ReadRMWZeroX    RRAZeroX
  2762.         RotateRightAdc
  2763.  
  2764. RRAAbs_2    ReadRMWAbs    RRAAbs
  2765.         RotateRightAdc
  2766.  
  2767. RRAAbsX_2    ReadRMWAbsX    RRAAbsX
  2768.         RotateRightAdc
  2769.  
  2770. RRAAbsY_2    ReadRMWAbsY    RRAAbsY
  2771.         RotateRightAdc
  2772.  
  2773. RRAIndX_2    ReadRMWIndX    RRAIndX
  2774.         RotateRightAdc
  2775.  
  2776. RRAIndY_2    ReadRMWIndY    RRAIndY
  2777.         RotateRightAdc
  2778.  
  2779.  
  2780. *
  2781. * DEC/CMP-Gruppe (DCP)
  2782. *
  2783.  
  2784. DecCompare    MACRO
  2785.         move.b    RA,d2
  2786.         move.b    RDBUF,d1
  2787.         move.w    RADR,d0
  2788.         subq.b    #1,d1
  2789.         cmp.b    d1,d2
  2790.         move    ccr,RCCR
  2791.         scc    RCARRY        ;Inverses Carry holen
  2792.         bsr    WriteByte
  2793.         Last
  2794.         ENDM
  2795.  
  2796. DCPZero_2    ReadRMWZero    DCPZero
  2797.         DecCompare
  2798.  
  2799. DCPZeroX_2    ReadRMWZeroX    DCPZeroX
  2800.         DecCompare
  2801.  
  2802. DCPAbs_2    ReadRMWAbs    DCPAbs
  2803.         DecCompare
  2804.  
  2805. DCPAbsX_2    ReadRMWAbsX    DCPAbsX
  2806.         DecCompare
  2807.  
  2808. DCPAbsY_2    ReadRMWAbsY    DCPAbsY
  2809.         DecCompare
  2810.  
  2811. DCPIndX_2    ReadRMWIndX    DCPIndX
  2812.         DecCompare
  2813.  
  2814. DCPIndY_2    ReadRMWIndY    DCPIndY
  2815.         DecCompare
  2816.  
  2817.  
  2818. *
  2819. * INC/SBC-Gruppe (ISB)
  2820. *
  2821.  
  2822. IncSbc        MACRO
  2823.         move.b    RCARRY,d2
  2824.         move.b    RDBUF,d1
  2825.         not.b    d2
  2826.         move.w    RADR,d0
  2827.         addq.b    #1,d1
  2828.         add.b    d2,d2        ;Inverses Carry -> X
  2829.         move.b    RA,d2
  2830.         subx.b    d1,d2
  2831.         scc    RCARRY        ;Inverses Carry holen
  2832.         svs    ROVERFLOW    ;Overflow holen
  2833.         move.b    d2,RA
  2834.         move    ccr,RCCR
  2835.         bsr    WriteByte
  2836.         Last
  2837.         ENDM
  2838.  
  2839. ISBZero_2    ReadRMWZero    ISBZero
  2840.         IncSbc
  2841.  
  2842. ISBZeroX_2    ReadRMWZeroX    ISBZeroX
  2843.         IncSbc
  2844.  
  2845. ISBAbs_2    ReadRMWAbs    ISBAbs
  2846.         IncSbc
  2847.  
  2848. ISBAbsX_2    ReadRMWAbsX    ISBAbsX
  2849.         IncSbc
  2850.  
  2851. ISBAbsY_2    ReadRMWAbsY    ISBAbsY
  2852.         IncSbc
  2853.  
  2854. ISBIndX_2    ReadRMWIndX    ISBIndX
  2855.         IncSbc
  2856.  
  2857. ISBIndY_2    ReadRMWIndY    ISBIndY
  2858.         IncSbc
  2859.  
  2860.  
  2861. *
  2862. * Unübliche Befehle
  2863. *
  2864.  
  2865. ANCImm_2    ReadByteImm        ;??? ($0b, $2b)
  2866.         and.b    d0,RA
  2867.         move    ccr,RCCR
  2868.         smi    RCARRY        ;N -> C (??)
  2869.         Last
  2870.  
  2871. SBXImm_2    ReadByteImm
  2872.         move.b    RX,d1
  2873.         and.b    RA,d1
  2874.         sub.b    d0,d1
  2875.         move    ccr,RCCR
  2876.         scc    RCARRY        ;Inverses Carry holen
  2877.         move.b    d1,RX
  2878.         Last
  2879.  
  2880.  
  2881. *
  2882. * Erweiterte Opcodes
  2883. *
  2884.  
  2885. ; $f2 $xx
  2886. OpIEC        ReadPCInc
  2887.         tst.b    d0
  2888.         beq    OpIECOut
  2889.         cmp.b    #1,d0
  2890.         beq    OpIECOutATN
  2891.         cmp.b    #2,d0
  2892.         beq    OpIECOutSec
  2893.         cmp.b    #3,d0
  2894.         beq    OpIECIn
  2895.         cmp.b    #4,d0
  2896.         beq    OpIECSetATN
  2897.         cmp.b    #5,d0
  2898.         beq    OpIECRelATN
  2899.         cmp.b    #6,d0
  2900.         beq    OpIECTurnaround
  2901.         cmp.b    #7,d0
  2902.         beq    OpIECRelease
  2903.         bra    IllegalOp
  2904.  
  2905. OpIECOut    move.b    $95(RAMPTR),d0    ;Auszugebendes Byte holen
  2906.         move.b    $a3(RAMPTR),d1    ;EOI-Flag holen
  2907.         jsr    IECOut
  2908.         bra    IECSetST
  2909.  
  2910. OpIECOutATN    move.b    $95(RAMPTR),d0    ;Auszugebendes Byte holen
  2911.         jsr    IECOutATN
  2912.         bra    IECSetST
  2913.  
  2914. OpIECOutSec    move.b    $95(RAMPTR),d0    ;Auszugebendes Byte holen
  2915.         jsr    IECOutSec
  2916.         bra    IECSetST
  2917.  
  2918. OpIECIn        jsr    IECIn
  2919.         move.b    d1,RA        ;Byte in den Akku
  2920.         move    ccr,RCCR    ;Flags entsprechend setzen
  2921.         bra    IECSetST
  2922.  
  2923. OpIECSetATN    jsr    IECSetATN
  2924.         move.w    #$edfb,RPC    ;Nach $edfb springen
  2925.         Last
  2926.  
  2927. OpIECRelATN    jsr    IECRelATN
  2928.         bra    IECReturn
  2929.  
  2930. OpIECTurnaround    jsr    IECTurnaround
  2931.         bra    IECReturn
  2932.  
  2933. OpIECRelease    jsr    IECRelease
  2934.         bra    IECReturn
  2935.  
  2936. IECSetST    or.b    d0,$90(RAMPTR)    ;Status setzen
  2937.         clr.b    RCARRY        ;Carry löschen
  2938. IECReturn    bra    RTS_2        ;RTS ausführen
  2939.  
  2940.  
  2941. **
  2942. ** Konstanten
  2943. **
  2944.  
  2945. *
  2946. * Opcode Dispatch Table
  2947. * Jeder Eintrag zeigt auf die erste Zyklusroutine (d.h. die Routine
  2948. * des zweiten Zyklus) eines Opcodes
  2949. * "*" bezeichnet einen undokumentierten Opcode
  2950. *
  2951.  
  2952.         CNOP    0,4
  2953. OpcodeTable    dc.l    BRK_2        ;$00
  2954.         dc.l    ORAIndX_2
  2955.         dc.l    IllegalOp
  2956.         dc.l    SLOIndX_2    ;*
  2957.         dc.l    NOPZero_2    ;*
  2958.         dc.l    ORAZero_2
  2959.         dc.l    ASLZero_2
  2960.         dc.l    SLOZero_2    ;*
  2961.  
  2962.         dc.l    PHP_2        ;$08
  2963.         dc.l    ORAImm_2
  2964.         dc.l    ASLA_2
  2965.         dc.l    ANCImm_2    ;*
  2966.         dc.l    NOPAbs_2    ;*
  2967.         dc.l    ORAAbs_2
  2968.         dc.l    ASLAbs_2
  2969.         dc.l    SLOAbs_2    ;*
  2970.  
  2971.         dc.l    BPL_2        ;$10
  2972.         dc.l    ORAIndY_2
  2973.         dc.l    IllegalOp
  2974.         dc.l    SLOIndY_2    ;*
  2975.         dc.l    NOPZeroX_2    ;*
  2976.         dc.l    ORAZeroX_2
  2977.         dc.l    ASLZeroX_2
  2978.         dc.l    SLOZeroX_2    ;*
  2979.  
  2980.         dc.l    CLC_2        ;$18
  2981.         dc.l    ORAAbsY_2
  2982.         dc.l    NOPImpl_2    ;*
  2983.         dc.l    SLOAbsY_2    ;*
  2984.         dc.l    NOPAbsX_2    ;*
  2985.         dc.l    ORAAbsX_2
  2986.         dc.l    ASLAbsX_2
  2987.         dc.l    SLOAbsX_2    ;*
  2988.  
  2989.         dc.l    JSR_2        ;$20
  2990.         dc.l    ANDIndX_2
  2991.         dc.l    IllegalOp
  2992.         dc.l    RLAIndX_2    ;*
  2993.         dc.l    BITZero_2
  2994.         dc.l    ANDZero_2
  2995.         dc.l    ROLZero_2
  2996.         dc.l    RLAZero_2    ;*
  2997.  
  2998.         dc.l    PLP_2        ;$28
  2999.         dc.l    ANDImm_2
  3000.         dc.l    ROLA_2
  3001.         dc.l    ANCImm_2    ;*
  3002.         dc.l    BITAbs_2
  3003.         dc.l    ANDAbs_2
  3004.         dc.l    ROLAbs_2
  3005.         dc.l    RLAAbs_2    ;*
  3006.  
  3007.         dc.l    BMI_2        ;$30
  3008.         dc.l    ANDIndY_2
  3009.         dc.l    IllegalOp
  3010.         dc.l    RLAIndY_2    ;*
  3011.         dc.l    NOPZeroX_2    ;*
  3012.         dc.l    ANDZeroX_2
  3013.         dc.l    ROLZeroX_2
  3014.         dc.l    RLAZeroX_2    ;*
  3015.  
  3016.         dc.l    SEC_2        ;$38
  3017.         dc.l    ANDAbsY_2
  3018.         dc.l    NOPImpl_2    ;*
  3019.         dc.l    RLAAbsY_2    ;*
  3020.         dc.l    NOPAbsX_2    ;*
  3021.         dc.l    ANDAbsX_2
  3022.         dc.l    ROLAbsX_2
  3023.         dc.l    RLAAbsX_2    ;*
  3024.  
  3025.         dc.l    RTI_2        ;$40
  3026.         dc.l    EORIndX_2
  3027.         dc.l    IllegalOp
  3028.         dc.l    SREIndX_2    ;*
  3029.         dc.l    NOPZero_2    ;*
  3030.         dc.l    EORZero_2
  3031.         dc.l    LSRZero_2
  3032.         dc.l    SREZero_2    ;*
  3033.  
  3034.         dc.l    PHA_2        ;$48
  3035.         dc.l    EORImm_2
  3036.         dc.l    LSRA_2
  3037.         dc.l    IllegalOp
  3038.         dc.l    JMPAbs_2
  3039.         dc.l    EORAbs_2
  3040.         dc.l    LSRAbs_2
  3041.         dc.l    SREAbs_2    ;*
  3042.  
  3043.         dc.l    BVC_2        ;$50
  3044.         dc.l    EORIndY_2
  3045.         dc.l    IllegalOp
  3046.         dc.l    SREIndY_2    ;*
  3047.         dc.l    NOPZeroX_2    ;*
  3048.         dc.l    EORZeroX_2
  3049.         dc.l    LSRZeroX_2
  3050.         dc.l    SREZeroX_2    ;*
  3051.  
  3052.         dc.l    CLI_2        ;$58
  3053.         dc.l    EORAbsY_2
  3054.         dc.l    NOPImpl_2    ;*
  3055.         dc.l    SREAbsY_2    ;*
  3056.         dc.l    NOPAbsX_2    ;*
  3057.         dc.l    EORAbsX_2
  3058.         dc.l    LSRAbsX_2
  3059.         dc.l    SREAbsX_2    ;*
  3060.  
  3061.         dc.l    RTS_2        ;$60
  3062.         dc.l    ADCIndX_2
  3063.         dc.l    IllegalOp
  3064.         dc.l    RRAIndX_2    ;*
  3065.         dc.l    NOPZero_2    ;*
  3066.         dc.l    ADCZero_2
  3067.         dc.l    RORZero_2
  3068.         dc.l    RRAZero_2    ;*
  3069.  
  3070.         dc.l    PLA_2        ;$68
  3071.         dc.l    ADCImm_2
  3072.         dc.l    RORA_2
  3073.         dc.l    IllegalOp
  3074.         dc.l    JMPInd_2
  3075.         dc.l    ADCAbs_2
  3076.         dc.l    RORAbs_2
  3077.         dc.l    RRAAbs_2    ;*
  3078.  
  3079.         dc.l    BVS_2        ;$70
  3080.         dc.l    ADCIndY_2
  3081.         dc.l    IllegalOp
  3082.         dc.l    RRAIndY_2    ;*
  3083.         dc.l    NOPZeroX_2    ;*
  3084.         dc.l    ADCZeroX_2
  3085.         dc.l    RORZeroX_2
  3086.         dc.l    RRAZeroX_2    ;*
  3087.  
  3088.         dc.l    SEI_2        ;$78
  3089.         dc.l    ADCAbsY_2
  3090.         dc.l    NOPImpl_2    ;*
  3091.         dc.l    RRAAbsY_2    ;*
  3092.         dc.l    NOPAbsX_2    ;*
  3093.         dc.l    ADCAbsX_2
  3094.         dc.l    RORAbsX_2
  3095.         dc.l    RRAAbsX_2    ;*
  3096.  
  3097.         dc.l    NOPImm_2    ;* $80
  3098.         dc.l    STAIndX_2
  3099.         dc.l    NOPImm_2    ;*
  3100.         dc.l    SAXIndX_2    ;*
  3101.         dc.l    STYZero_2
  3102.         dc.l    STAZero_2
  3103.         dc.l    STXZero_2
  3104.         dc.l    SAXZero_2    ;*
  3105.  
  3106.         dc.l    DEY_2        ;$88
  3107.         dc.l    NOPImm_2    ;*
  3108.         dc.l    TXA_2
  3109.         dc.l    IllegalOp
  3110.         dc.l    STYAbs_2
  3111.         dc.l    STAAbs_2
  3112.         dc.l    STXAbs_2
  3113.         dc.l    SAXAbs_2    ;*
  3114.  
  3115.         dc.l    BCC_2        ;$90
  3116.         dc.l    STAIndY_2
  3117.         dc.l    IllegalOp
  3118.         dc.l    IllegalOp
  3119.         dc.l    STYZeroX_2
  3120.         dc.l    STAZeroX_2
  3121.         dc.l    STXZeroY_2
  3122.         dc.l    SAXZeroY_2    ;*
  3123.  
  3124.         dc.l    TYA_2        ;$98
  3125.         dc.l    STAAbsY_2
  3126.         dc.l    TXS_2
  3127.         dc.l    IllegalOp
  3128.         dc.l    IllegalOp
  3129.         dc.l    STAAbsX_2
  3130.         dc.l    IllegalOp
  3131.         dc.l    IllegalOp
  3132.  
  3133.         dc.l    LDYImm_2    ;$a0
  3134.         dc.l    LDAIndX_2
  3135.         dc.l    LDXImm_2
  3136.         dc.l    IllegalOp
  3137.         dc.l    LDYZero_2
  3138.         dc.l    LDAZero_2
  3139.         dc.l    LDXZero_2
  3140.         dc.l    LAXZero_2    ;*
  3141.  
  3142.         dc.l    TAY_2        ;$a8
  3143.         dc.l    LDAImm_2
  3144.         dc.l    TAX_2
  3145.         dc.l    IllegalOp
  3146.         dc.l    LDYAbs_2
  3147.         dc.l    LDAAbs_2
  3148.         dc.l    LDXAbs_2
  3149.         dc.l    LAXAbs_2    ;*
  3150.  
  3151.         dc.l    BCS_2        ;$b0
  3152.         dc.l    LDAIndY_2
  3153.         dc.l    IllegalOp
  3154.         dc.l    IllegalOp
  3155.         dc.l    LDYZeroX_2
  3156.         dc.l    LDAZeroX_2
  3157.         dc.l    LDXZeroY_2
  3158.         dc.l    LAXZeroY_2    ;*
  3159.  
  3160.         dc.l    CLV_2        ;$b8
  3161.         dc.l    LDAAbsY_2
  3162.         dc.l    TSX_2
  3163.         dc.l    IllegalOp
  3164.         dc.l    LDYAbsX_2
  3165.         dc.l    LDAAbsX_2
  3166.         dc.l    LDXAbsY_2
  3167.         dc.l    LAXAbsY_2    ;*
  3168.  
  3169.         dc.l    CPYImm_2    ;$c0
  3170.         dc.l    CMPIndX_2
  3171.         dc.l    NOPImm_2    ;*
  3172.         dc.l    DCPIndX_2    ;*
  3173.         dc.l    CPYZero_2
  3174.         dc.l    CMPZero_2
  3175.         dc.l    DECZero_2
  3176.         dc.l    DCPZero_2    ;*
  3177.  
  3178.         dc.l    INY_2        ;$c8
  3179.         dc.l    CMPImm_2
  3180.         dc.l    DEX_2
  3181.         dc.l    SBXImm_2    ;*
  3182.         dc.l    CPYAbs_2
  3183.         dc.l    CMPAbs_2
  3184.         dc.l    DECAbs_2
  3185.         dc.l    DCPAbs_2    ;*
  3186.  
  3187.         dc.l    BNE_2        ;$d0
  3188.         dc.l    CMPIndY_2
  3189.         dc.l    IllegalOp
  3190.         dc.l    DCPIndY_2    ;*
  3191.         dc.l    NOPZeroX_2    ;*
  3192.         dc.l    CMPZeroX_2
  3193.         dc.l    DECZeroX_2
  3194.         dc.l    DCPZeroX_2    ;*
  3195.  
  3196.         dc.l    CLD_2        ;$d8
  3197.         dc.l    CMPAbsY_2
  3198.         dc.l    NOPImpl_2    ;*
  3199.         dc.l    DCPAbsY_2    ;*
  3200.         dc.l    NOPAbsX_2    ;*
  3201.         dc.l    CMPAbsX_2
  3202.         dc.l    DECAbsX_2
  3203.         dc.l    DCPAbsX_2    ;*
  3204.  
  3205.         dc.l    CPXImm_2    ;$e0
  3206.         dc.l    SBCIndX_2
  3207.         dc.l    NOPImm_2    ;*
  3208.         dc.l    ISBIndX_2    ;*
  3209.         dc.l    CPXZero_2
  3210.         dc.l    SBCZero_2
  3211.         dc.l    INCZero_2
  3212.         dc.l    ISBZero_2    ;*
  3213.  
  3214.         dc.l    INX_2        ;$e8
  3215.         dc.l    SBCImm_2
  3216.         dc.l    NOPImpl_2
  3217.         dc.l    SBCImm_2    ;*
  3218.         dc.l    CPXAbs_2
  3219.         dc.l    SBCAbs_2
  3220.         dc.l    INCAbs_2
  3221.         dc.l    ISBAbs_2    ;*
  3222.  
  3223.         dc.l    BEQ_2        ;$f0
  3224.         dc.l    SBCIndY_2
  3225.         dc.l    OpIEC        ;Patch
  3226.         dc.l    ISBIndY_2    ;*
  3227.         dc.l    NOPZeroX_2    ;*
  3228.         dc.l    SBCZeroX_2
  3229.         dc.l    INCZeroX_2
  3230.         dc.l    ISBZeroX_2    ;*
  3231.  
  3232.         dc.l    SED_2        ;$f8
  3233.         dc.l    SBCAbsY_2
  3234.         dc.l    NOPImpl_2    ;*
  3235.         dc.l    ISBAbsY_2    ;*
  3236.         dc.l    NOPAbsX_2    ;*
  3237.         dc.l    SBCAbsX_2
  3238.         dc.l    INCAbsX_2
  3239.         dc.l    ISBAbsX_2    ;*
  3240.  
  3241.  
  3242. *
  3243. * Speicherkonfigurationstabelle
  3244. *
  3245.  
  3246. ; Diese Tabelle enthält für alle 8 Speicherkonfigurationen
  3247. ; die Zeiger auf die zugehörigen Read- und WriteTabs
  3248. ConfigTab    dc.l    ReadTab0,WriteTab0
  3249.         dc.l    ReadTab1,WriteTab1
  3250.         dc.l    ReadTab2,WriteTab2
  3251.         dc.l    ReadTab3,WriteTab3
  3252.         dc.l    ReadTab4,WriteTab4
  3253.         dc.l    ReadTab5,WriteTab5
  3254.         dc.l    ReadTab6,WriteTab6
  3255.         dc.l    ReadTab7,WriteTab7
  3256.  
  3257. *
  3258. * Sonstige Konstanten
  3259. *
  3260.  
  3261. ; Taglist für CreateNewProc
  3262. ProcTags    dc.l    NP_Entry,CPUTaskProc
  3263.         dc.l    NP_Name,CPUTaskName
  3264.         dc.l    NP_Priority,-1
  3265.         dc.l    0
  3266.  
  3267. ; Strings
  3268. CPUTaskName    dc.b    "6510",0
  3269.  
  3270. ; Flag: Dies ist Frodo SC
  3271.         CNOP    0,4
  3272. _IsFrodoSC
  3273. IsFrodoSC    dc.w    1
  3274.  
  3275.  
  3276. **
  3277. ** Initialisierte Daten
  3278. **
  3279.  
  3280.         SECTION    "DATA",DATA
  3281.  
  3282. ; Requester
  3283. IllegalOpReq    dc.l    20,0,0,0,0
  3284.  
  3285.  
  3286. **
  3287. ** Nicht initialisierte Daten
  3288. **
  3289.  
  3290.         SECTION    "BSS",BSS
  3291.  
  3292. ; Sprungtabellen für Speicherzugriff: Ein Eintrag pro Seite
  3293. ; Eine Tabelle für jede der 8 Speicherkonfigurationen
  3294. ReadTab0    ds.l    256
  3295. ReadTab1    ds.l    256
  3296. ReadTab2    ds.l    256
  3297. ReadTab3    ds.l    256
  3298. ReadTab4    ds.l    256
  3299. ReadTab5    ds.l    256
  3300. ReadTab6    ds.l    256
  3301. ReadTab7    ds.l    256
  3302.  
  3303. WriteTab0    ds.l    256
  3304. WriteTab1    ds.l    256
  3305. WriteTab2    ds.l    256
  3306. WriteTab3    ds.l    256
  3307. WriteTab4    ds.l    256
  3308. WriteTab5    ds.l    256
  3309. WriteTab6    ds.l    256
  3310. WriteTab7    ds.l    256
  3311.  
  3312.  
  3313.         SECTION    "__MERGED",BSS
  3314.  
  3315. ; 6510-Task
  3316. CPUProc        ds.l    1    ;Prozess-Handle
  3317.         XDEF    _CPUTask
  3318. _CPUTask
  3319. CPUTask        ds.l    1    ;Task des Prozesses
  3320. InitialSP    ds.l    1    ;Stackpointer
  3321. ReadySet    ds.l    1    ;Signal des Hauptprogramms
  3322. _InvokeSAMSet
  3323. InvokeSAMSet    ds.l    1    ;Signal -> Hauptprogramm: SAM aufrufen
  3324. ContinueSet    ds.l    1    ;Signal des CPU-Tasks
  3325. ReadySig    ds.b    1
  3326. InvokeSAMSig    ds.b    1
  3327. ContinueSig    ds.b    1
  3328.  
  3329. ; 6510-Register
  3330.         CNOP    0,4
  3331. RA        ds.b    1    ;A
  3332. RX        ds.b    1    ;X
  3333. RY        ds.b    1    ;Y
  3334. RDBUF        ds.b    1    ;Puffer für RMW-Befehle
  3335. RS        ds.w    1    ;S (16-Bit, $01xx)
  3336. RCCR        ds.w    1    ;CCR, nur N und Z
  3337. RCARRY        ds.b    1    ;6510-Carry
  3338. ROVERFLOW    ds.b    1    ;6510-Overflow-Flag
  3339. RDECIMAL    ds.b    1    ;6510-Dezimalflag
  3340. RINTERRUPT    ds.b    1    ;6510-Interruptflag
  3341. RADR
  3342. RADRH        ds.b    1    ;Adreß-Latch
  3343. RADRL        ds.b    1
  3344. RADR2
  3345. RADR2H        ds.b    1    ;Zweites Adreß-Latch für indiziert-indirekt
  3346. RADR2L        ds.b    1
  3347. RPR        ds.b    1    ;Prozessorport Datenregister
  3348. RDDR        ds.b    1    ;Prozessorport Datenrichtungsregister
  3349.  
  3350. ; Zwischenspeicher für Adc/Sbc im Dezimalmodus
  3351. TMPS        ds.b    1
  3352. TMPA        ds.b    1
  3353.  
  3354.     IFNE    DEBUG_DETAIL
  3355. DEBUGON        ds.b    1
  3356.     ENDC
  3357.  
  3358. ; Zeiger auf die der aktuellen Speicherkonfiguration entsprechenden
  3359. ;  Read/WriteTab
  3360.         CNOP    0,4
  3361. RDTAB        ds.l    1
  3362. WRTAB        ds.l    1
  3363.  
  3364. ; Speicherzeiger
  3365. TheRAM        ds.l    1    ;Zeiger auf C64-RAM (64K)
  3366. TheRAMPTR    ds.l    1    ;Zeiger auf C64-RAM, Offset 32K (für Adressierung mit Vorzeichen)
  3367. TheBasic    ds.l    1    ;Zeiger auf Basic-ROM
  3368. TheKernal    ds.l    1    ;Zeiger auf Kernal-ROM
  3369. TheChar        ds.l    1    ;Zeiger auf Char-ROM
  3370. TheColor    ds.l    1    ;Zeiger auf Farb-RAM
  3371.  
  3372. ; Interrupt-Flags. Bei einem Interrupt wird eins dieser Flags gesetzt.
  3373. ; Das bewirkt, daß beim nächsten Opcode-Fetch der 6510-Task in die
  3374. ; Routine "HandleInt" springt. Dort werden diese Flags ausgewertet und
  3375. ; entsprechend verzweigt.
  3376.         CNOP    0,4
  3377. Interrupt            ;Zusammenfassung als Langwort
  3378. IntIsRESET    ds.b    1    ;RESET aufgetreten, 6510 beenden oder Pause
  3379. IntIsNMI    ds.b    1    ;NMI aufgetreten
  3380. IntIsIRQ            ;Zusammenfassung als Wort
  3381. IntIsVICIRQ    ds.b    1    ;IRQ durch VIC aufgetreten
  3382. IntIsCIAIRQ    ds.b    1    ;IRQ durch CIA-A aufgetreten
  3383.  
  3384. FirstIRQCycle    ds.l    1    ;Zyklus, an dem IRQ zuletzt auf low ging
  3385. FirstNMICycle    ds.l    1    ;Zyklus, an dem NMI zuletzt auf low ging
  3386.  
  3387. RESETIsEXIT    ds.b    1    ;Zur Unterscheidung von RESET und EXIT
  3388. RESETIsPause    ds.b    1    ;Zur Unterscheidung von RESET und Pause
  3389.  
  3390. NMIState    ds.b    1    ;Aktueller Zustand der NMI-Leitung (für Flankentriggerung)
  3391.  
  3392. ; Bus Available vom VIC
  3393. BALow        ds.b    1
  3394.  
  3395. ; Zwischenspeicher für Lesezugriff mit BA
  3396.         CNOP    0,4
  3397. HALTCONTSTORE    ds.l    1
  3398. HALTRETADR    ds.l    1
  3399. HALTADRSTORE    ds.w    1
  3400.  
  3401. ; Argumente für EasyRequest
  3402.         CNOP    0,4
  3403. RequestStream    ds.l    16
  3404.  
  3405. ; Registerinhalte für SAM, nur gültig innerhalb von Pause6510/Resume6510
  3406.         XDEF    _RA
  3407. _RA        ds.b    1
  3408.         XDEF    _RX
  3409. _RX        ds.b    1
  3410.         XDEF    _RY
  3411. _RY        ds.b    1
  3412.         XDEF    _RP
  3413. _RP        ds.b    1
  3414.         XDEF    _RPR
  3415. _RPR        ds.b    1
  3416.         XDEF    _RDDR
  3417. _RDDR        ds.b    1
  3418.         XDEF    _RPC
  3419. _RPC        ds.w    1
  3420.         XDEF    _RS
  3421. _RS        ds.w    1
  3422.  
  3423.         XDEF    _SAMMemConfig
  3424. _SAMMemConfig    ds.b    1    ;CHAREN, LORAM, HIRAM
  3425.  
  3426.         END
  3427.